我不能无限期地使用fscanf()吗?

时间:2019-01-06 15:10:06

标签: c

#include <stdio.h>

main() {
    int n;
    FILE *file;
    printf("We are here to create a file!\n");
    file = fopen("demo.txt", "w+");
    if (file != NULL)
        printf("Succesfully opened!");

    printf("Enter number\n");
    while (scanf("%d", &n)) {
        fprintf(file, "%d", n);
    }
    fclose(file);
}

为什么fscanf()在这里不起作用? scanf在这里工作正常,但是fscanf()在这里没有响应或工作。谁能解释这个问题是什么?

1 个答案:

答案 0 :(得分:1)

您的代码有一些问题:

  • 没有参数的main的原型是int main(void)
  • 如果无法打开文件,则不退出程序。如果fopen返回NULL,您将有不确定的行为,因为稍后您将此空指针传递给fprintf
  • 循环重复进行,直到scanf()返回0。相反,您应该在scanf()返回1的同时进行迭代。如果scanf()在文件末尾失败,将返回EOF,从而导致无限循环。
  • 您可能应该在fprintf()中的数字之后输出分隔符,否则所有数字都将聚集在一起,形成一个长数字序列。
  • main()应该返回0或错误状态

这是更正的版本:

#include <stdio.h>

int main(void) {
    int n;
    FILE *file;

    printf("We are here to create a file\n");
    file = fopen("demo.txt", "w");
    if (file != NULL) {
        printf("Successfully opened\n");
    } else {
        printf("Cannot open demo.txt\n");
        return 1;
    }
    printf("Enter numbers\n");
    while (scanf("%d", &n) == 1) {
        fprintf(file, "%d\n", n);
    }
    fclose(file);
    return 0;
}

关于您的问题:为什么我不能使用fscanf()而不是scanf()

  • 您可以使用fscanf(),只要为其打开一个流指针即可读取:如果您编写while (fscanf(stdin, "%d", &n) == 1),程序将以相同的方式运行。
  • 如果您希望fscanf()file中读取,则需要在读写操作之间执行文件定位命令,例如rewind()中的fseek()。但是,如果文件中当前位置没有要读取的数字,则fscanf()将失败,并且由于您以file模式打开"w+"fopen()将被截断。< / li>

通过在文件中写入数字,将其倒带到开头并重新读取相同的数字等,可以导致无限循环。

以下是一些说明代码:

#include <stdio.h>

int main(void) {
    int n;
    FILE *file;

    printf("We are here to create a file\n");
    file = fopen("demo.txt", "w+");
    if (file != NULL) {
        printf("Successfully opened\n");
    } else {
        printf("Cannot open demo.txt\n");
        return 1;
    }
    printf("Enter a number: ");
    if (scanf("%d", &n) == 1) {
        fprintf(file, "%d\n", n);
        rewind(file);
        while (fscanf(file, "%d", &n) == 1) {
            printf("read %d from the file\n", n);
            if (n == 0)
                break;
            rewind(file);
            fprintf(file, "%d\n", n >> 1);
            rewind(file);
        }
    }
    fclose(file);
    return 0;
}

互动:

We are here to create a file
Successfully opened
Enter a number: 10
read 10 from the file
read 5 from the file
read 2 from the file
read 1 from the file
read 0 from the file