【问题标题】:fprintf is not working properly in Visual Studio (C programming)fprintf 在 Visual Studio 中无法正常工作(C 编程)
【发布时间】: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。我对此代码的预期是:

  1. 待创建的data.txt
  2. fgetc 读取 EOF(因为文件上没有写入任何内容,但这是真的)
  3. 待写
  4. 要移动到文件开头的指针(文件中的 A 后面)
  5. 在第二个中,如果 fgetc 读取 "A" 并将文件指针向前移动一个字符
  6. 在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


【解决方案1】:

C18 § 7.21.5.3 说(我的粗体字)

7 当以更新模式打开文件时(“+”作为上述模式参数值列表中的第二个或第三个字符),可以在关联的流上执行输入和输出。但是,如果没有对 fflush 函数或文件定位函数(fseek、fsetpos 或 rewind)的干预调用,则输出不应直接跟随输入,并且 输入不应在没有干预调用的情况下直接跟随输出一个文件定位函数,除非输入操作遇到文件尾。

这就是为什么在读取'A'后写入"B"不能正常工作,并按照C标准添加fseek(),使其工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    相关资源
    最近更新 更多