Как записать данные структуры в файл?

454
26 ноября 2017, 14:56

Имеется часть кода:

struct St
{
    char Name[30];
    int math;
    int phys;
    int inf;
    int chem;
    int dateOfBirth;
    int group;
    double ball;
} Students;
void addStudent() {
    f1 = fopen("list.txt", "w");
    cout << "Enter the Name of student: ";
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    gets_s(Students.Name, 29);
    cout << "Enter the math ball: ";
    cin >> Students.math;
    cout << "Enter the informatics ball: ";
    cin >> Students.inf;
    cout << "Enter the physics ball: ";
    cin >> Students.phys;
    cout << "Enter the chemistry ball: ";
    cin >> Students.chem;
    cout << "Enter the date of birth: ";
    cin >> Students.dateOfBirth;
    cout << "Enter the group of student: ";
    cin >> Students.group;
    cout << "Enter the average ball: ";
    cin >> Students.ball;
    fwrite(&Students, 1, sizeof(Students), f1);
    fclose(f1);
}

Задача - считать данные с консоли, записать их в переменные структуры и позже записать данные структуры в файл. Сделал таким образом, однако в файле получаю:

Sergei юююююююююююююююююююююю   

   Р  
       $@

Думаю, что ошибка в fwrite(), но не до конца понимаю, как в нее правильно записать параметры, ибо в структуре переменные разных типов

Answer 1

Да нет, у вас тип - нормальный plain old data, так что все, что, возможно, надо сделать - добавить букву b в режиме работы файла, если вы в Windows (в Linux вроде разницы нет? Точно не уверен...), чтоб это был именно бинарный файл.

Ваш вариант записи просто сбрасывает в файл все, что есть в структуре. Только вот и читать его потом нужно через fread в такую же структуру. Ясно, что "глазами" вы видите частично мусор (пустое место, оставшееся в поле имени) и бинарные представления чисел.

Если же вам нужно именно для человека - ну, открывайте ofstream и пишите с помощью <<, например. Или в файл, открытый через fopen, с помощью fprintf. Только тогда смотрите, пишите так, чтоб потом могли прочесть - например, имя на отдельной строке, чтоб не спуталось при чтении с числами.

READ ALSO
Как скомпилировать SDL 2.0 под MinGW

Как скомпилировать SDL 2.0 под MinGW

Целый день мучаюсь вроде все правильно делаю, все пути к библиотекамlib и

228
Не получается запустить более 4 потоков URLDownloadToFile

Не получается запустить более 4 потоков URLDownloadToFile

Имеется такая функция, которая нужно выполнять одновременно в 100 потоков

220
Проблема с загрузкой изображения через WinInet[Решено]

Проблема с загрузкой изображения через WinInet[Решено]

Здравствуйте! Пытаюсь загрузить картинку логотип гугла(https://wwwgoogle

241