Member 14980990 Ответов: 3

Мой код не печатает данные в файл correclty


Я пишу код на языке Си, который будет считывать данные из текстового файла, содержащего следующие данные: имя, возраст, доход

После успешного считывания данных они будут разделены на два разных файла: в первом-все записи, возраст которых ниже среднего
Во втором все записи чей доход выше среднего

Однако мой код печатает только последние данные в оба файла. Я не знаю, что не так с моим кодом.

Что я уже пробовал:

МОЙ КОД
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct 
{
    char name[15];
    int age;
    float income;
} data;

void input(FILE*, data*);
void output1(FILE*, data*);
void output2(FILE* file2, data* data);

int main(void) {
        data p;
        data *place = &p;
        char fileR[10] = "F1.txt", file1W[10] = "F2.txt", file2W[10] = "F3.txt";
        float ave_income = 0, sum_income = 0; 
        int ave_age = 0, sum_age = 0, count = 0;
        
        FILE *fi, *fo1, *fo2;
        fi = fopen(fileR, "r");
        fo1 = fopen(file1W, "w");
        fo2 = fopen(file2W, "w");
        
        do{
            input(fi, place);
            sum_age+=p.age;
            ++count;        
            
        }while(fgetc(fi)!=EOF);
        
        ave_age = sum_age/count;

        do{
            if (p.age < ave_age) 
            {   
                output1(fo1, place);
            }       
            else
            {
                continue;
            }
        }while(fgetc(fi)!=EOF);
        
        do{
            input(fi, place);
            sum_income+=p.income;       
            
        }while(fgetc(fi)!=EOF);
        
        ave_income = sum_income/count;

        do{
            if (p.income > ave_income) 
            {   
                output2(fo2, place);
            }       
            else
            {
                continue;
            }
        }while(fgetc(fi)!=EOF);
    
fclose(fi);
fclose(fo1);    
fclose(fo2);

return 0; 
}
        
void input(FILE* f, data* data)
{
    fscanf(f, "%s %d %f", data->name,&data->age,&data->income);
}
     
void output1(FILE* file, data* data)
{
    fprintf(file, "Name %s \nAge: %d\nWind Income: %f \n", data->name, data->age, data->income ); //prints to the file
    printf("Name %s \nAge: %d\nIncome: %f \n",data->name, data->age, data->income); //prints
}

void output2(FILE* file2, data* data)
{
    fprintf(file2, "Name %s \nAge: %d\nWind Income: %f \n", data->name, data->age, data->income ); //prints to the file
    printf("Name %s \nAge: %d\nIncome: %f \n",data->name, data->age, data->income); //prints


ТЕКСТОВЫЙ ФАЙЛ
Alex    25  670
John    24  830
Jessica 31  800
Milana  27  680
Kaarel  28  1200
Triin   34  1300
Maria   29  1450
Jaanus  28  1350
Maaris  26  1100

3 Ответов

Рейтинг:
2

Patrice T

Цитата:
Однако мой код печатает только последние данные в оба файла. Я не знаю, что не так с моим кодом.

Перестаньте гадать, используйте отладчик и убедитесь сами.
#include <stdio.h>
        FILE *fi, *fo1, *fo2;
        fi = fopen(fileR, "r");
        fo1 = fopen(file1W, "w");
        fo2 = fopen(file2W, "w");
        
        do{
            input(fi, place); // Here you are reading fi
            sum_age+=p.age;
            ++count;        
            
        }while(fgetc(fi)!=EOF); // til the EOF
        
        ave_age = sum_age/count;

        do{ // what make you think that you are rereading fi in this loop ?
            // What make you think that there is something to read in fi ?
            if (p.age < ave_age) 
            {   
                output1(fo1, place);
            }       
            else
            {
                continue;
            }
        }while(fgetc(fi)!=EOF);

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
1

OriginalGriff

Во-первых, вам вообще не нужен этот код:

else
{
    continue;
}
Он вообще ничего не делает, так как цикл все равно будет продолжаться!

Теперь о проблеме, которую вы заметили:
Посмотрите на свой код:
        do{
            input(fi, place);
...
        }while(fgetc(fi)!=EOF);
        
        ave_age = sum_age/count;

        do{
...
        }while(fgetc(fi)!=EOF);

Поскольку указатель файла вообще не меняется между первым и вторым циклами, а единственный выход из первого цикла-это когда вы находитесь в конце файла, ваш второй цикл завершится сразу же после первой итерации, поскольку он проверяет точно то же самое: конец файла.
Либо сохраните все результаты по мере прохождения первого цикла и обработайте их за секунду, либо перемотайте / закройте и снова откройте файл между циклами.

Я настоятельно рекомендую вам начать учиться использовать отладчик - он действительно может помочь при поиске подобных проблем!


Рейтинг:
0

KarstenK

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

Почему вы используете две разные выходные функции с одним и тем же кодом? => сухой