gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:03:20 25 4
gpt4 key购买 nike

#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() 没有响应或工作。谁能解释一下问题是什么?

最佳答案

您的代码有一些问题:

  • 不带参数的 main 原型(prototype)是 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()。然而,如果文件中的当前位置没有可读取的数字,并且使用 "w+" 打开 file,则 fscanf() 将会失败模式,fopen() 将被截断。

您可能会通过向文件写入数字、将其倒回到开头并重新读取相同的数字等来导致无限循环。

这里是一些用于说明的代码:

#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

关于我不能无限期地使用 fscanf() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54062856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com