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
在我的代码中,我从控制台获取输入并将其写入文件 "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