fprintf在Visual Studio(C编程)中无法正常工作



当我遇到这个问题时,我正在visual studio(2015专业版(中处理文件

看看这个代码:

#include <stdio.h>
int main()
{
char a;
FILE* H = fopen("data.txt", "w+");
if (fgetc(H) == EOF)
{
fprintf(H, "A");
fseek(H, 0, SEEK_SET);
}
if (( a = fgetc(H)) == 'A')
{
fprintf(H, "B");
}
fclose(H);
}

问题是";A";正在写入data.txt文件,但B没有。我尝试在调试模式下运行代码。它进入第二个";如果";然后到达fprintf(H,"B"(,但仍然没有运气,B没有被写在文件上。我做的下一件事是检查fprintf的返回值,所以我尝试了这个代码:

#include <stdio.h>
int main()
{
char a;
int err;
FILE* H = fopen("data.txt", "w+");
if (fgetc(H) == EOF)
{
fprintf(H, "A");
fseek(H, 0, SEEK_SET);
}
if (( a = fgetc(H)) == 'A')
{
err = fprintf(H, "B");
}
fclose(H);
}

错误显示fprintf(H,"B"(的返回值为1,但data.txt上唯一写的仍然是A。我对这段代码的预期是:

要创建的
  1. data.txt
  2. fgetc读取EOF(因为文件上没有写任何内容,但它是真的(
  3. A待编写
  4. 要移动到文件开头的指针(位于文件中的A后面(
  5. 在第二个if"0"中;A";由fgetc读取,文件指针向前移动一个字符
  6. 在data.txt文件中的A之后写入的末尾B

嗯。。。除了上一次,所有的事情都发生了。我联系了那些使用visualstudio以外的不同编译器的人。然而,对他们来说,这段代码运行得非常好,结果是"AB";正在写入文件。后来,当我使用fseek移动文件的指针时,它基本上解决了这个问题,但我仍然想知道为什么没有fseek的参与,它就不起作用,从逻辑上讲,一切对我来说都很好,尽管我不确定为什么它不在visual studio中起作用。(顺便说一句,对于那些用fseek寻求修复的人来说:(这是代码(

#include <stdio.h>
int main()
{
char a;
int err;
FILE* H = fopen("data.txt", "w+");
if (fgetc(H) == EOF)
{
fprintf(H, "A");
fseek(H, 0, SEEK_SET);
}
if ((a = fgetc(H)) == 'A')
{
fseek(H, 0, SEEK_CUR);
err = fprintf(H, "B");
}
fclose(H);
}

C18§7.21.5.3说(我的黑体字(

7当文件以更新模式打开时("+"是上面模式参数值列表中的第二个或第三个字符(,可以在相关流上执行输入和输出。但是,如果没有对fflush函数或文件定位函数(fseek、fsetpos或reback(的介入调用,则输出后不应直接跟着输入,并且如果没有对文件定位函数的介入调用,则输入后不应直接输出,除非输入操作遇到文件结尾。

这就是为什么在读取'A'之后写入"B"没有正确工作,并且根据C标准添加fseek()使其能够工作。

最新更新