Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
输出中显示两次的值(C编程)_C_File - Fatal编程技术网

输出中显示两次的值(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充其量是笨拙的,通常是错误的。