#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()
在这里没有响应或工作。谁能解释这个问题是什么?
答案 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