【发布时间】:2021-01-13 22:30:32
【问题描述】:
当我遇到这个问题时,我正在 Visual Studio (2015 Professional) 中处理文件
看看这段代码:
#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 没有。 我尝试在调试模式下运行代码。它去了第二个“if”,然后到达 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);
}
错误显示 1 作为 fprintf(H, "B") 的返回值,但写入 data.txt 的唯一内容仍然是 A。我对此代码的预期是:
- 待创建的data.txt
- fgetc 读取 EOF(因为文件上没有写入任何内容,但这是真的)
- 待写
- 要移动到文件开头的指针(文件中的 A 后面)
- 在第二个中,如果 fgetc 读取 "A" 并将文件指针向前移动一个字符
- 在data.txt文件中最后B要写在A之后
嗯...除了最后一个之外,所有这一切都发生了。我联系了使用 Visual Studio 以外的其他编译器的人。但是,对他们来说,这段代码运行得非常好,结果是“AB”被写在文件上。 后来当我使用 fseek 移动文件的指针时,它几乎解决了这个问题,但我仍然想知道为什么它在没有 fseek 参与的情况下不起作用,逻辑上一切对我来说看起来都很好,虽然我不确定为什么它不在视觉工作室工作。 (顺便说一下,对于那些使用 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);
}
【问题讨论】:
-
如果您在第一个
fprintf之后fflush怎么办? -
OT:关于:
FILE* H = fopen("data.txt", "w+");在调用fopen()后,始终检查(!=NULL)返回值以确保操作成功。 -
关于:
char a;和if (( a = fgetc(H)) == 'A')函数:fgetc()返回int,而不是char。 -
链接清楚地显示
int fgetc(FILE *stream),示例显示int c;。 C 库几乎从不对单个字符使用char类型。 -
"我们通常不会在打开文件后检查文件指针
!= NULL。"你从哪里得到你的信息?您应该始终检查文件是否打开。当您开始假设 I/O 应该发生什么应该时,您的代码非常薄弱。
标签: c visual-studio file