将文件中的整数扫描到C中的数组中

Scanning integers from a file into an array in C?

本文关键字:数组 整数 文件 扫描      更新时间:2023-10-16

我在获取程序时遇到问题,该程序旨在将斐波那契序列生成到一个文件中,然后读回。我不确定r=的问题是在扫描还是打印,但我一直得到很长的错误数字

#include<stdio.h>
int main(){
    //Step 1
    int N;
    scanf(" %d", &N);
    if(N > 2){
        printf("You entered argument: %dn", 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 failedn");
        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

正如Johnny Mopp所指出的,您不会倒带文件,所以在第二步中,当您阅读时,您已经在文件末尾了。如果您测试了不同scanf的返回代码,这将是显而易见的。

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

fseek(fib, 0L, SEEK_SET);

在步骤2开始时

无论如何:始终测试输入函数的结果

您可以:

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

我不太喜欢r+/w+模式,而且它们在实践中没有太多用途(imo),除非您处理像/dev/mem之类的特殊文件。

请参阅http://www.cplusplus.com/reference/cstdio/fopen/