3

我从来没有意识到这一点。我本可以下意识地假设一个很难的事实,即我可以在现有文件的读写之间转换打开它的更新模式,就像那样。但是关于 SO( 1,2 )的两个问题驱使我持怀疑态度,我决定尝试一下。这是我发现的:

在第一个程序中prog1,我处理一个source.txt只有行致命武器的文件。我阅读了第一个世界致命武器,fscanf()并打算在之后写“火枪”,期望得到致命火枪。但它根本失败,我仍然在写入操作结束时获取原始内容致命武器fseek(fp,0,SEEK_CUR)。但是在第一个程序中,如果我插入行,写入操作工作正常,我得到致命火枪。我注意到fseek(fp,0,SEEK_CUR)除了调用之外没有其他fseek()用途其中,因为根本没有寻网。

但是在第二个程序中prog2,相同的场景不需要该fseek(fp,0,SEEK_CUR)语句。确切地说,在第二个程序中,与在第一个程序中读取文件中间相反,这里我读取到文件末尾,然后开始写作。这里即使不使用也能成功写入fseek(fp,0,SEEK_CUR),我得到了想要的内容致命武器销售

问题:为什么我们不能在文件中间从模式转换read到模式?让它工作有什么不同?同时,如果我们读取到文件末尾并在那里写入,为什么相同的转换工作没有任何大惊小怪?为什么在第二种情况下不需要?我在第一个程序中使写入成功的建议有多大?还有更好的选择吗?writefseek(fp,0,SEEK_CUR)fseek(fp,0,SEEK_CUR)fseek(fp,0,SEEK_CUR)

关于 SO 的两个问题似乎在某种程度上解决了同一个问题,但是由于它们更多地基于寻求对文本/书籍摘录的解释,因此针对它们的答案似乎并没有准确地解决我打算知道的内容.

//PROG1

#include <stdio.h>

int main ()
{
    FILE *fp=fopen("D:\\source.txt","r+");
    char arr[20],brr[50];
    fscanf(fp,"%s",arr);
    printf("String is %s\n",arr);
    //fseek(fp,0,SEEK_CUR);  //Doesn't work without it
    fprintf(fp," musket");
    rewind(fp);
    fgets(brr,50,fp);
    printf("New string is %s",brr);
    fclose(fp);
}

输出:

1)没有fseek()-- 致命武器

2)fseek() —— 致命的火枪

//PROG2    

#include <stdio.h>

int main ()
{
    FILE *fp=fopen("D:\\source.txt","r+");
    char arr[20],brr[50];
    fgets(arr,20,fp);
    printf("Initial line is %s\n",arr);
    fprintf(fp," sale"); //writes to end of file
    rewind(fp);
    printf("New string is %s",fgets(brr,50,fp));
    fclose(fp);
}

没有 fseek() 的输出: - Lethal weapon sale

4

1 回答 1

0

实际上,它看起来像是您的 libc 实现中的一个错误。文件 I/O 流通常是对由 OS 内核实现的基于文件描述符的二进制 I/O 的 libc 抽象。因此,任何奇怪的行为都应归因于您特定的 libc 怪癖。

由于您显然使用的是 Windows,这可能是您的问题的根源。你使用的是什么编译器?GCC 4.6.1 和 glibc-2.13 在 Ubuntu 11.10 上没有这样的问题。

于 2013-05-24T10:54:49.920 回答