Сканирование целых чисел из файла в массив в C?

0

У меня возникли проблемы с получением моей программы, которая предназначена для генерации последовательности Фибоначчи в файл, а затем для ее чтения. Я не уверен, что проблема r = заключается в сканировании или печати, но я продолжаю получать очень длинные неправильные номера

#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
Теги:
arrays
printf
scanf

2 ответа

0
Лучший ответ

Вы также можете:

  • rewind(fib); вызова rewind(fib); для сброса указателя файла на начало файла
  • Или, между шагами 1 и 2, вызовите fclose(fib); , а затем снова открыть его с помощью fopen("Fibonacci", "r"); , и в этом случае первый вызов fopen может просто иметь "w" в качестве второго аргумента.

Я не являюсь большим поклонником r+/w+, и на практике их практически нет (imo), если вы не обрабатываете специальные файлы, такие как /dev/mem или что-то еще.

См. Http://www.cplusplus.com/reference/cstdio/fopen/

1

Как отметил Джонни Мопп, вы не перематываете файл, поэтому на втором этапе вы уже находитесь в конце файла при чтении. Если бы вы протестировали код возврата для другого scanf, это было бы очевидно.

Вы должны либо закрыть, либо снова открыть файл, либо позвонить

fseek(fib, 0L, SEEK_SET);

в начале шага 2

В любом случае: всегда проверяйте результат входных функций.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню