gpt4 book ai didi

c - a+ 模式下不使用 fseek 的读取操作会导致文件中出现额外的空格

转载 作者:行者123 更新时间:2023-11-30 17:00:12 25 4
gpt4 key购买 nike

当我执行下面的代码时,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 在读取之前没有完成,它应该只影响我认为的读取操作。为什么文件中会写入额外的空格?在a+模式下,如果没有进行写操作,则读指针指向开头。但如果写操作完成,我想指针将位于末尾。在这种情况下,如果没有 fseek,read 不应该显示任何内容,对吗?无论如何,阅读可能会出现问题。但是为什么即使写入是在读取之前完成的,写入也会出现问题。

我使用的是Codeblock 15.12,默认的mingw带有codeblock。

编辑:我进一步思考这是否可能是一些与编译器相关的问题。捕获旧的 Visual Studio 6 并编译。最后打印出几行不可读的字符。所以这不是编译器问题。某处看起来有一些愚蠢的问题。

最佳答案

经过一番搜索,我发现在读取文件之前需要使用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);
}

关于c - a+ 模式下不使用 fseek 的读取操作会导致文件中出现额外的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37732498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com