【问题标题】:Scanning integers from a file into an array in C?将文件中的整数扫描到C中的数组中?
【发布时间】:2014-12-09 14:04:24
【问题描述】:

我无法获取我的程序,该程序旨在将斐波那契数列生成到一个文件中,然后将其读回。我不确定 r=problem 是否出在扫描或打印上,但我总是得到很长的错误数字

#include<stdio.h>

int main(){

    //Step 1
    int N;
    scanf(" %d", &N);

    if(N > 2){
        printf("You entered argument: %d\n", N);}
    else{
        printf("That is an illegal argument. N must be greater than 2.");
        return 0;}

    unsigned long a = 1;
    unsigned long b = 1;
    unsigned long c;
    int count = 2;

    FILE *fib;
    fib = fopen("Fibonacci", "w+");
    if (fib == NULL) {
        printf("Open TestFile failed\n");
        return -1;}


    fprintf(fib, "%lu %lu ",a,b);
    printf("%lu %lu ",a,b);
    for(count; count < N; count++){
        if(count % 4 == 0){
            fprintf(fib, "\n");
            printf("\n");}

        c = a+b;
        if(c < a){
            printf("integer overflow, ending number generation.");
            break;}
        fprintf(fib, "%lu ",c);
        printf("%lu ",c);
        a = b;
        b = c;
    }
    fflush(fib);
    printf("\ncount = %d",count);

    //Step 2

    unsigned long med;
    int middle;
    unsigned long nums[count];
    int j;
    if(count % 2 == 1){
        middle = (count/2);
        for(j = 0; j < count; j++){
            fscanf(fib, "%lu", &nums[j]);}
        med = nums[middle];
        printf("\nmedian = %lu", med);}


    unsigned long test1 = nums[0];
    unsigned long test2 = nums [1];
    unsigned long test3 = nums [2];
    printf("\nnums array: %lu %lu %lu",test1, test2, test3);


    return 0;
}

如果输入为3,则输出为

You entered argument: 3

1 1 2 

count = 3

median = 221891732872

nums array: 140733854067968 221891732872 26447888

【问题讨论】:

标签: c++ c arrays printf scanf


【解决方案1】:

正如 Johnny Mopp 所说,您不会倒带文件,因此在第二步中,您在阅读时已经处于文件末尾。如果你测试过不同scanf的返回码,那就很明显了。

您应该关闭并重新打开文件,或者调用

fseek(fib, 0L, SEEK_SET);

在第 2 步开始时

无论如何:总是测试输入函数的结果。

【讨论】:

    【解决方案2】:

    你可以:

    • 调用rewind(fib); 将文件指针重置为文件开头
    • 或者,在第 1 步和第 2 步之间,调用fclose(fib);,然后使用fopen("Fibonacci", "r"); 重新打开它,在这种情况下,第一个fopen 调用可以简单地将"w" 作为第二个参数。

    我不是 r+/w+ 模式的忠实拥护者,它们在实践中没有太多用途 (imo),除非您正在处理诸如 /dev/mem 之类的特殊文件。

    见http://www.cplusplus.com/reference/cstdio/fopen/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-19
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多