输出中显示两次的值(C编程)
我写了一个程序,在不同的文件中打印奇数和偶数。我的节目是输出中显示两次的值(C编程),c,file,C,File,我写了一个程序,在不同的文件中打印奇数和偶数。我的节目是 #include<stdio.h> int main() { FILE *f1,*f2,*f3; int n,i,num; f1 = fopen("number.txt","w"); printf("Enter the number:"); scanf("%d",&n); for(i=1;i<=n;i++) fprintf(f1,"%d ",i)
#include<stdio.h>
int main()
{
FILE *f1,*f2,*f3;
int n,i,num;
f1 = fopen("number.txt","w");
printf("Enter the number:");
scanf("%d",&n);
for(i=1;i<=n;i++)
fprintf(f1,"%d ",i);
fprintf(f1,"\n");
fclose(f1);
f1 = fopen("number.txt","r");
f2 = fopen("even.txt","w");
f3 = fopen("odd.txt","w");
fprintf(f2,"Even numbers:\n");
fprintf(f3,"Odd numbers:\n");
while(!feof(f1)){
fscanf(f1,"%d",&num);
if(num%2 == 0)
fprintf(f2,"%d ",num);
else
fprintf(f3,"%d ",num);
}
fclose(f1);
fclose(f2);
fclose(f3);
return 0;
}
为什么我在偶数输出中得到两个10?feof是真的,当您在文件结尾处或之后读取时
读取最后一个数字10的scanf操作将不会设置eof位,因为您尚未尝试在文件结尾处或之后读取。循环再次运行,然后在scanf期间设置eof位,但输出最后一个数字之前的num中的任何内容,因此是双输出
一种可能的修复方法是使while循环为true,并在fscanf之后立即进行feof检查,如果是,则断开。feof是true,当您在或超过文件末尾读取时
读取最后一个数字10的scanf操作将不会设置eof位,因为您尚未尝试在文件结尾处或之后读取。循环再次运行,然后在scanf期间设置eof位,但输出最后一个数字之前的num中的任何内容,因此是双输出
一种可能的修复方法是使while循环为true,并在fscanf后立即进行feof检查,如果是,则中断。his中的诊断是准确的。不过,规定的解决方案不太令人满意
固定代码应为:
while (fscanf(f1, "%d", &num) == 1)
{
if (num % 2 == 0)
fprintf(f2, "%d ", num);
else
fprintf(f3, "%d ", num);
}
putc('\n', f2);
putc('\n', f3);
他的诊断是准确的。不过,规定的解决方案不太令人满意
固定代码应为:
while (fscanf(f1, "%d", &num) == 1)
{
if (num % 2 == 0)
fprintf(f2, "%d ", num);
else
fprintf(f3, "%d ", num);
}
putc('\n', f2);
putc('\n', f3);
以下内容如您所期望的那样起作用,虽然我不确定这是最好、最干净的方式,但只多了一行:
//
// main.c
// evenOdd
//
#include<stdio.h>
int main() {
FILE *f1,*f2,*f3;
int n,i,num;
f1 = fopen("number.txt","w");
printf("Enter the number:");
scanf("%d",&n);
for(i=1;i<=n;i++)
fprintf(f1,"%d ",i);
fprintf(f1,"\n");
fclose(f1);
f1 = fopen("number.txt","r");
f2 = fopen("even.txt","w");
f3 = fopen("odd.txt","w");
fprintf(f2,"Even numbers:\n");
fprintf(f3,"Odd numbers:\n");
for (i=1; !feof(f1); ++i) {
fscanf(f1, "%d", &num);
if (feof(f1) != 0) {return 0;} else // check if EOF
if (num%2 == 0) {
fprintf(f2, "%d ", num);
} else fprintf(f3, "%d ", num);
}
fclose(f1);
fclose(f2);
fclose(f3);
return 0;
}
以下内容如您所期望的那样起作用,虽然我不确定这是最好、最干净的方式,但只多了一行:
//
// main.c
// evenOdd
//
#include<stdio.h>
int main() {
FILE *f1,*f2,*f3;
int n,i,num;
f1 = fopen("number.txt","w");
printf("Enter the number:");
scanf("%d",&n);
for(i=1;i<=n;i++)
fprintf(f1,"%d ",i);
fprintf(f1,"\n");
fclose(f1);
f1 = fopen("number.txt","r");
f2 = fopen("even.txt","w");
f3 = fopen("odd.txt","w");
fprintf(f2,"Even numbers:\n");
fprintf(f3,"Odd numbers:\n");
for (i=1; !feof(f1); ++i) {
fscanf(f1, "%d", &num);
if (feof(f1) != 0) {return 0;} else // check if EOF
if (num%2 == 0) {
fprintf(f2, "%d ", num);
} else fprintf(f3, "%d ", num);
}
fclose(f1);
fclose(f2);
fclose(f3);
return 0;
}
在这种情况下,测试I/O函数fscanf比使用feof要好得多。在发现问题后使用feof来区分EOF和错误ferror告诉您这是一个错误。但这是feof的唯一合法用途。循环控制或双重测试feof充其量是笨拙的,通常是错误的。在这种情况下,测试I/O函数fscanf比使用feof要好得多。在发现问题后使用feof来区分EOF和错误ferror告诉您这是一个错误。但这是feof的唯一合法用途。循环控制或双重测试feof充其量是笨拙的,通常是错误的。