Запись структуры в текстовый файл на C++

struct student{
        char name[20];
        char course[20];
        int age;
        float gpa;
    };

using namespace std;
main()
{
    ifstream infile;
    infile.open("student data.txt");
    ofstream outfile;
    outfile.open("student data 2.txt");
    if (!infile || !outfile)
    {
        cout << "error opening or creating file" << endl;
        exit(1);
    }

    student stu[2];
    infile.seekg(0, ios::beg);
    while(!infile.eof())
    {
    int i;
    for(i=0; i<=2; i++)
        {
            infile >> stu[i].name;
            infile >> stu[i].course;
            infile >> stu[i].age;
            infile >> stu[i].gpa;
        }
    }
    outfile.seekp(0, ios::beg);
    int i =0;
    while(i<3)
    {
        outfile << stu[i].name << endl;

        outfile << stu[i].course << endl;

        outfile << stu[i].age << endl;

        outfile << stu[i].gpa << endl;
        i++;
    }

    infile.close();
    outfile.close();
}

Я пытаюсь понять, почему этот код не работает ... он не дает никаких ошибок компиляции, но когда я запускаю приложение, оно перестает работать. Он говорит, что raw.exe (имя приложения) не работает. может кто-нибудь помочь :(

while(!infile.eof()) в сочетании с for(i=0; i<=2; i++) кажется немного странным. В цикле for вы можете попытаться прочитать за конец файла, прежде чем вы вернетесь к проверке конца файла. И несколько слов экспертов по использованию while(!infile.eof()): Почему iostream :: eof внутри условия цикла считается неправильным?
user4581301 14.06.2018 00:24

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

user2100815 14.06.2018 00:24

Предпочитайте использовать std::string для текста, это избавит вас от многих проблем (например, при переполнении буфера).

Thomas Matthews 14.06.2018 00:38

обе эти петли работают нормально. цикл for выполняется три раза, затем завершается, а затем мы достигаем конца файла, поэтому цикл while также завершается. половина кода работает нормально (до попадания данных в структуру). записывающая часть в выходной файл (данные о студентах 2.txt) не работает. и это не дает никаких ошибок компилятора.

Mr.bunty 14.06.2018 00:39

IMHO, вы должны перегрузить operator>> в своем классе. Сохраняйте знания о членах данных класса внутри класса; класс знает, как читать элементы данных.

Thomas Matthews 14.06.2018 00:39

Предпочтительнее использовать std::vector, чем массивы. Массивы имеют фиксированный размер и страдают от проблем с переполнением буфера (и количество допустимых элементов не определено).

Thomas Matthews 14.06.2018 00:40

Ваша проблема - индексы. Вы создаете массив из двух структур student stu[2];. Затем вы заполняете его тремя for(i=0; i<=2; i++).

fcooper8472 14.06.2018 00:42

Я также должен сказать, что было бы намного легче помочь, если бы вы (1) вставили код, который действительно компилируется (включая #include ...), и (2) если вы поделитесь какими-либо входными данными, необходимыми для воспроизведения вашей проблемы (содержимое "student data.txt").

fcooper8472 14.06.2018 00:48

его #include <iostream>, <fstream> и <stdlib.h>. входные данные во входном файле: nasir CS201 23 3 Jamil CS201 31 4 Faisal CS201 25 3.5

Mr.bunty 14.06.2018 00:55

fcooper8472 .... я думаю, что количество массивов начинается с 0. и есть три массива. stu [0], stu [1], stu [2].

Mr.bunty 14.06.2018 00:58

может ли кто-нибудь просто отредактировать мой код и дать мне посмотреть, пожалуйста ...

Mr.bunty 14.06.2018 00:59

user8541301 спасибо, что указали на цикл while .. это не было неправильным, но бесполезным здесь.

Mr.bunty 14.06.2018 01:02

@ Mr.bunty lol, да, счетчик массивов начинается с 0, но если вы не знаете, как char myarray[10] дает вам индексы от 0 до 9, перейдите на справочный веб-сайт C++ и узнайте, как работает C++, прежде чем размещать здесь. Если вы объявляете массив размером 2, а индекс начинается с 0, почему вы думаете, что размер волшебным образом становится равным 3? "а есть три массива". Нет, вы объявили массив размером 2, есть два объекта. Один с индексом 0, а другой с индексом 1.

MPops 14.06.2018 01:24

Большое спасибо mpops и fcooper8472 ... я только что сделал глупую ошибку при индексировании массива. спасибо, парни, и извините fcooper8472, если мой вышеупомянутый комментарий вас оскорбил, :)

Mr.bunty 14.06.2018 01:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
14
5 971
1

Ответы 1

Хорошо, это, к счастью, очень простое решение! Проблема, с которой вы столкнулись, связана с управлением памятью. Эта строка вызывает у вас все проблемы:

student stu[2];

А ТАКЖЕ

int i =0;
while(i<3)

По сути, вы инициализируете 2 структуры (индексы 0-1) типа student, а затем ожидаете перебора 3 структур (из индекса 0-2). При попытке чтения в третьей структуре вы можете получить ошибку нарушения доступа к памяти.

Итак, я запустил ваш код с этим текстом в "student data.txt"

nasir CS201 23 3
Jamil CS201 31 4
Faisal CS201 25 3.5

Когда были инициализированы только две структуры, «данные студента 2» оставались пустыми. Однако при увеличении значения до student stu[3]; "данные студента 2.txt" дали следующий результат:

nasir
CS201
23
3
Jamil
CS201
31
4
Faisal
CS201
25
3.5

Вот код, который я использовал для создания успешной версии вашей программы с парочкой дополнительных printf для отладки.

#include <iostream>
#include <fstream>

    struct student {
    char name[20];
    char course[20];
    int age;
    float gpa;
};

using namespace std;
int main()
{
    ifstream infile;
    infile.open("student data.txt");
    ofstream outfile;
    outfile.open("student data 2.txt");
    if (!infile || !outfile)
    {
        cout << "error opening or creating file" << endl;
        exit(1);
    }

    student stu[3];                 //NOTE THIS LINE NOW HAS 3 STRUCTS INITIALIZED
    infile.seekg(0, ios::beg);
    while (!infile.eof())
    {
        int i;
        for (i = 0; i <= 2; i++)
        {
            infile >> stu[i].name;
            infile >> stu[i].course;
            infile >> stu[i].age;
            infile >> stu[i].gpa;
            printf("%s %s %d %f\n", stu[i].name, stu[i].course, stu[i].age, stu[i].gpa);
        }
    }

    outfile.seekp(0, ios::beg);
    int i = 0;
    while (i<3)
    {
        outfile << stu[i].name << endl;
        outfile << stu[i].course << endl;
        outfile << stu[i].age << endl;
        outfile << stu[i].gpa << endl;
        printf("%s %s %d %f\n", stu[i].name, stu[i].course, stu[i].age, stu[i].gpa);
        i++;
    }

    infile.close();
    outfile.close();
    return 1;
}

Надеюсь это поможет!

Большое спасибо, чувак ... вы указали правильную проблему, но эта проблема уже решена, как вы можете видеть в комментариях. в любом случае большое спасибо. :)

Mr.bunty 14.06.2018 02:45

Другие вопросы по теме