当我在代码下面执行时,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并编译。最后会打印几行不可读的字符。所以这不是编译器问题。在某个地方看起来有些愚蠢的问题。
答案 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);
}