EOF 在 c 中无法正常工作,打印也很荒谬

EOF is not working properly in c as well printing is also absurd

在我的代码中,我从控制台获取输入并将其写入文件 "test",我从控制台获取输入,直到遇到 EOF ((fscanf(stdin,"% c %s %d %f",&a,b,&c,&d))!=EOF) as fscanf returns EOF 如果我们在扫描时输入 EOF(ctrl+Z)。但是我的代码在获取一个 EOF 后并没有停止,它需要两个或三个 EOF 进行扫描 termination.I 手动检查第一个 EOF returns 什么都没有,第二个 EOF 返回一个和第三个 EOF returns -1.After 扫描终止它还打印荒谬的东西。 我的代码如下

#include<stdio.h>
int main()
{
    FILE *f;
    char a,b[100];
    int c;
    float d;
    f=fopen("test","w");
    if(f==NULL)
        printf("error");
    while((fscanf(stdin,"%c %s %d %f",&a,b,&c,&d))!=EOF)
        fprintf(f,"%c%s%d%f",a,b,c,d);
    fclose(f);
    f=fopen("test","r");
    while((fscanf(f,"%c%s%d%f",&a,b,&c,&d))!=EOF)
        printf("%c %s %d %f\n",a,b,c,d);
    return 0;
}

fscanf() returns 成功读取的项目数。它不会 return EOF。检查这个:https://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm

发布的代码没有正确处理换行符。第二行输入将以 \n 开头,位于上一行输入的左侧,并且此字符与 %c 转换说明符匹配。当从键盘发出 EOF 信号时,此匹配已完成,因此 fscanf() 函数 returns 1 而不是 EOF。第二次发出 EOF 信号时,输入流中没有字符,没有进行匹配并返回 EOF

这也部分解释了乱码输出,因为写入文件的第二行以 \n 字符而不是预期字符开头。此外,写入文件的 fprintf() 调用不会在字段之间留下 space,因此稍后尝试读回数据失败。

此外,当代码检查文件是否第一次成功打开时,如果没有,什么都不做。这是已发布代码的一个版本,其中包含更正,如果文件无法打开,它会退出并显示一条错误消息,如果文件无法关闭,它也会打印一条错误消息,如果文件在重新打开之前无法关闭,则会退出。

A space 已添加到 fscanf() 格式字符串的开头,以便跳过开头的白色 spaces,包括换行符。 fprintf() 格式字符串的指令之间放置了空格,最后是 \n,以便后续调用 fscanf() 可以识别这些字段。请注意,如果 fscanf() 格式字符串中的 %s 没有宽度说明符,则存在缓冲区溢出的风险。但即使有了这种改进,如果输入的字符串太大,输入也会因多余的字符而出现乱码。最好使用 fgets()sscanf(),并更仔细地验证输入。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *f;
    char a, b[100];
    int c;
    float d;

    f = fopen("test", "w");
    if(f == NULL) {
        fprintf(stderr, "Unable to open file for writing\n");
        exit(EXIT_FAILURE);
    }

    while((fscanf(stdin," %c%99s%d%f", &a, b, &c, &d)) != EOF)
        fprintf(f,"%c %s %d %f\n", a, b, c, d);

    if (fclose(f) != 0) {
        fprintf(stderr, "Unable to close file\n");
        exit(EXIT_FAILURE);
    }

    f = fopen("test", "r");
    if(f == NULL) {
        fprintf(stderr, "Unable to open file for reading\n");
        exit(EXIT_FAILURE);
    }

    while((fscanf(f," %c%99s%d%f", &a, b, &c, &d)) != EOF)
        printf("%c %s %d %f\n", a, b, c, d);

    if (fclose(f) != 0) {
        fprintf(stderr, "Unable to close file\n");
    }

    return 0;
}

这是一个交互示例。换行符终止每行输入:

λ> ./a.out
a first 3 3.14 
b second 42 2.71828
a first 3 3.140000
b second 42 2.718280