Чтение и запись с использованием fscanf и fprintf в цикле while

РЕДАКТИРОВАТЬ: с помощью участников здесь я обновил свой код. В настоящее время я пытаюсь решить, почему цикл while никогда не обнаруживает EOF.

Мне не нужен счетчик приращений для [i] в ​​моей функции returnStats(). Я нашел это интересным, и я не могу понять, почему.

В частности, в цикле while, который сканирует до конца файла. Как программа узнает, что нужно перейти к следующему элементу массива?

Кроме того, поскольку я больше не счетчик, я не могу использовать его для подсчета, поэтому я использовал j вместе с j++.

Детали моей программы следующие:

#include <stdio.h>

// function prototypes
void loadTextFile();
void returnStats();

// begin main function
int main(void){

    loadTextFile();
    returnStats();

    return 0;
} // end main function

// function which returns the number of entries, average, and maximum of the numbers read
void returnStats(){

    FILE *file = fopen("question5.txt","r");

    if(file == NULL)
    {
        printf("question3.dat cannot be opened!\n");
        fprintf(stderr, "Error opening the fil!\n");
    }

    else
        printf("\nquestion3.dat was opened successfully for reading.\n\n");

    int i=0, j=0; 
    int numbers[4];
    float average=0.0;
    int max=0;

    while(fscanf(file, "%d", &numbers[i]) != EOF) 
    {
        printf("%d was read from .txt file\n", numbers[i]);
        average += numbers[i];  

        if(numbers[i]>max)
            max = numbers[i];

        j++;    

    }   

    printf("\nThe number of entries is: %d", j);    
    printf("\nThe average of the numbers is: %.2f", average/4);
    printf("\nThe maximum of the numbers is: %d", max);

    fclose(file);

} // end returnAverage


// function to load the .txt file with array values so we may execute main on any computer. 
void loadTextFile(){

    FILE *file = fopen("question5.txt","w");

    if(file == NULL)
    {
        printf("question3.dat cannot be opened!\n");
        fprintf(stderr, "Error opening the fil!\n");
    }

    else
        printf("question3.dat was opened successfully for writing.\n");

    int numberArray[4]={56, 23, 89, 30};

    int i=0;

    for(i=0;i<4;i++)
    {
        fprintf(file, "%d\n", numberArray[i]);

    }

    printf("\nThe data was successfully written\n");

    fclose(file);
} // end function loadTextFile

Переработка кода

#include <stdio.h>

// function prototypes
void loadTextFile(FILE *file);
void returnStats(FILE *file);

// begin main function
int main(void){

    FILE *text = fopen("question6.txt","w");

    if(text == NULL)
    {
        printf("question6.dat cannot be opened!\n");
        fprintf(stderr, "Error opening the fil!\n");
    }

    else
        printf("\nquestion6.dat was opened successfully for Writing.\n\n");

    loadTextFile(text);
    returnStats(text);

    fclose(text);

    return 0;
} // end main function

// function which returns the number of entries, average, and maximum of the numbers read
void returnStats(FILE *file){


    int i=0;
    int number[4];

    while(fscanf(file, "%d", &number[i]) != EOF)
    //for (i=0;i<4;i++)
    {   
    //  fscanf(file, "%d", &number[i]);
        printf("\n%d : Was Read from the File\n", number[i]);
        fprintf(file, "%d\n", number[i]+10);
    }

} // end returnStats

// function to load the .txt file with array values so we may execute main on any computer. 
void loadTextFile(FILE *file){


    int numberArray[4]={56, 23, 89, 30};

    int i=0;

    for(i=0;i<4;i++)
    {
        fprintf(file, "%d\n", numberArray[i]);
        printf("\n%d : was written to the file\n", numberArray[i]);

    }

    printf("\nThe data was successfully written\n");

} // end function loadTextFile

person Arthur Green    schedule 20.11.2018    source источник
comment
Что заставляет вас думать, что программа переходит к следующему элементу? Внимательнее изучите свой код и попробуйте printfобработать каждый элемент numbers после прочтения файла.   -  person Alex    schedule 20.11.2018
comment
Если встречается нечисловой вводимый текст, while(fscanf(file, "%d", &numbers[i]) != EOF) { ...} будет бесконечный цикл. Предложить while(fscanf(file, "%d", &numbers[i]) == 1)   -  person chux - Reinstate Monica    schedule 20.11.2018
comment
@chux интересно, что программа не будет работать, когда == 1, но будет работать в цикле, когда == 0. Если я делаю обычный цикл for, он работает нормально.   -  person Arthur Green    schedule 20.11.2018


Ответы (2)


вам не нужно увеличивать позицию, потому что для этого вам не нужен массив. Ваша программа использует только первый элемент массива. Таким образом, он заменяет старое значение новым в файле. Но у вас есть только последнее значение в памяти.

person Tomáš Dejmek    schedule 20.11.2018
comment
Да, вы правы, я удалил массив из своего кода и сохранил переменную как int. - person Arthur Green; 20.11.2018

Простое решение, если это не повредит, — добавить строку в конце вывода в дочернем/клиентском процессе, например «\nend of output\n». Я не уверен, может ли fflush() помочь или просто попробовать

person anand    schedule 21.11.2018