在+模式下没有fseek的读取操作会在文件中产生额外的空白区域

时间:2016-06-09 17:22:23

标签: c mingw codeblocks

当我在代码下面执行时,m2.txt按预期正确创建了指定的数据。

#include <stdio.h>
int main()
{
    FILE *fp1;
    char ch;
    fp1=fopen("m2.txt", "a+");
    fputs("Hello, data is appended\0", fp1);
    fseek(fp1,0,SEEK_SET);
    while((ch=getc(fp1))!=EOF)
    {
        putc(ch,stdout);
    }
     fclose(fp1);
     return 0;
}

现在我评论了fseek并执行了以下代码。 (我在执行前删除了这个m2.txt文件)

#include <stdio.h>
int main()
{
    FILE *fp1;
    char ch;
    fp1=fopen("m2.txt", "a+");
    fputs("Hello, data is appended\0", fp1);
    //fseek(fp1,0,SEEK_SET);
    while((ch=getc(fp1))!=EOF)
    {
        putc(ch,stdout);
    }
     fclose(fp1);
     return 0;
}

令我惊讶的是,屏幕上显示的数据只有空格。甚至“你好,附加数据”也丢失了。 m2.txt文件也有很多空格。 为什么这个问题?如果在读取之前没有完成fseek,它应该只影响我认为的读操作。为什么要在文件中写入额外的空格? 在+模式下,如果没有完成写操作,则读指针指向开头。但是在写操作完成的情况下,指针将在最后我想。在这种情况下,如果没有fseek,读取不应该显示任何内容吗?无论如何,问题可能在那里阅读。但是,即使写入在读取之前完成,为什么写入也会出现问题。

我正在使用Codeblock 15.12,默认mingw附带了codeblock。

编辑: 我进一步认为它可能是一些编译器相关的问题。抓住旧的Visual Studio 6并编译。最后会打印几行不可读的字符。所以这不是编译器问题。在某个地方看起来有些愚蠢的问题。

1 个答案:

答案 0 :(得分:0)

经过一些搜索,我发现在读取文件之前需要fflush()或fclose()或fseek()。否则,可能填充/影响整个写缓冲区。尝试fflush()和写操作最后没有写任何垃圾,即使没有调用fseek()。这是代码(当然fseek()将在实际代码中存在fflush()。我只是评论了fseek并添加了fflush()用于测试目的。)

int main()
{
    FILE *fp1;
    char ch;
    fp1=fopen("m2.txt", "a+");
    fputs("Hello, data is appended", fp1);
    fflush(fp1);
   // fseek(fp1,0,SEEK_SET);
    while((ch=getc(fp1))!=EOF)
    {
        putchar(ch);
    }
     fclose(fp1);
     return (0);
}