Не считывается бинарный файл c++

338
05 декабря 2017, 21:34

Не считывается (или не записывается) бинарный файл, в чем проблема?

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
void InputBinary(char* name);
void showStudents(char* name);
struct student {
    struct {
        char name[15];
        char surname[15];
        char patronimic[15];
    } name;
    int course;
    char group[15];
    struct {
        int mark;
        char subject[15];
    } session[8];
    double scholarship = 0;
};
int main() {
    setlocale(LC_ALL, "UKR");
    char name[99];
    cin.getline(name, 98);
    InputBinary(name);
    showStudents(name);

    system("Pause");
    return 0;
}

void InputBinary(char* name) {
    int count;
    FILE* file = fopen(name, "ab");
    cout << "Введіть кількість студентів\n";
    cin >> count;
    cin.get();
    student *ToWrite = new student[count];
    for (int i = 0; i < count; i++) {
        cout << "Введіть Ім'я: ";
        cin.getline(ToWrite[i].name.name, 14);
        cout << "Введіть прізвище: ";
        cin.getline(ToWrite[i].name.surname, 14);
        cout << "Введіть по батькові: ";
        cin.getline(ToWrite[i].name.patronimic, 14);
        cout << "Введіть курс: ";
        cin >> ToWrite[i].course;
        cin.get();
        cout << "Введіть назву групи: ";
        cin.getline(ToWrite[i].group, 14);
        cout << "Введіть предмет та оцінку\n";
        for (int j = 0; j < 8; j++) {
            scanf("%s %d", ToWrite[i].session[j].subject, &ToWrite[i].session[j].mark);
        }
        cin.get();
    }
    fwrite(ToWrite, sizeof(student), count, file);
    fclose(file);
    delete[] ToWrite;
}
void showStudents(char* name) {
    FILE* file = fopen(name, "rb");
    fseek(file, 0, SEEK_END);
    int count = ftell(file) / sizeof(student);
    student *students = new student[count];
    fread(students, sizeof(student), count, file);
    for (int i = 0; i < count; i++) {
        cout << students[i].name.surname << " " << students[i].name.name << " " << students[i].name.patronimic << endl;
        cout << "Група: " << students[i].group << endl;
        cout << "Курс: " << students[i].course << endl;
        cout << "Розмір стипендії: " << students[i].scholarship << endl;
        cout << "Оцінки за останню сесію\n";
        for (int j = 0; j < 8; j++) {
            cout << students[i].session[j].subject << " : " << students[i].session[j].mark << endl;
        }
        cout << "-----------------------------\n";
    }
    fclose(file);
    delete[] students;

}
Answer 1

Вы становитесь на конец файла:

fseek(file, 0, SEEK_END);

а затем читаете:

fread(students, sizeof(student), count, file);

Вернитесь в начало файла перед чтением!

READ ALSO
Как в строке определить количество слов длины k без использования циклов?

Как в строке определить количество слов длины k без использования циклов?

Дана строка, где слова разделены пробелами и двоеточиямиНужно посчитать количество слов длиной меньше k и вернуть контейнер этих слов

353
Приведение типа

Приведение типа

В чем отличие этих двух способов приведения?

273
Сформировать строку для cURL из аргументов

Сформировать строку для cURL из аргументов

Строка для curl -> char* Делаю так:

220
Создание процесса

Создание процесса

Под Windows есть функция создания нового процесса CreateProcess которая создает процесс в новом окне, и в нее можно передать флаг CREATE_NO_WINDOW, что бы это...

211