1 / 1 / 0
Регистрация: 16.03.2013
Сообщений: 65
1

Запись/чтение из бинарного файла (.bin)

06.04.2016, 21:51. Показов 6426. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Беру информацию из текстового файла, записываю в двоичный и вывожу информацию на экран уже из двоичного файла.
Если текстовый файл закрывать в конце (вместе с двоичным), то все работает корректно, а если перед записью, то в результате прога работает бесконечно.
В чем может быть причина и как правильно осуществлять ввод/вывод из бинарного файла (думаю у меня некорректно сделано)?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
 
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus");
 
    fstream file("structure.txt");
    if (!file.is_open()) {
        file.open("structure.txt", fstream::binary);
        return 0;
    }
    fstream outfile("outstructure.bin");
    if (!file.is_open()) {
        file.open("outstructure.bin", fstream::binary);
        return 0;
    }
 
    const int n = 5;
    int i, j, im;
    struct university
    {
        char fam[20];
        char name[20];
        char otch[20];
        char gender[10];
        char facul[10];
        int kurs;
        int group;
        int mark[5];
        char city[20];
    };
 
    university students[n], study1;
    cout << "До сортировки: " << endl;
    for (int i = 0; i < n; i++)
    {
        file >> students[i].fam;
        file >> students[i].name;
        file >> students[i].otch;
        file >> students[i].gender;
        file >> students[i].facul;
        file >> students[i].kurs;
        file >> students[i].group;
        file >> students[i].mark[0];
        file >> students[i].mark[1];
        file >> students[i].mark[2];
        file >> students[i].mark[3];
        file >> students[i].mark[4];
        file >> students[i].city;
        cout << "Фамилия: " << students[i].fam << endl;
        cout << "Имя: " << students[i].name << endl;
        cout << "Отчество: " << students[i].otch << endl;
        cout << "Пол: " << students[i].gender << endl;
        cout << "Факультет: " << students[i].facul << endl;
        cout << "Курс: " << students[i].kurs << endl;
        cout << "Группа: " << students[i].group << endl;
        cout << "Оценка по программированию: " << students[i].mark[0] << endl;
        cout << "Оценка по литературе: " << students[i].mark[1] << endl;
        cout << "Оценка по математике: " << students[i].mark[2] << endl;
        cout << "Оценка по физике: " << students[i].mark[3] << endl;
        cout << "Оценка по теории алгоритмов: " << students[i].mark[4] << endl;
        cout << "Город: " << students[i].city << endl;
        cout << endl;
    }
 
    for (i = 0; i < n - 1; i++)
    {
        im = i;
        for (j = i + 1; j < n; j++)
            if (strcmp(students[im].city, students[j].city) > 0) im = j;
        study1 = students[i];
        students[i] = students[im];
        students[im] = study1;
    }
    file.close();
    //запись в бинарный файл
    for (i = 0; i < n; i++)
    {
        outfile.write((char*)&students[i].fam, sizeof students[i].fam);
        outfile.write((char*)&students[i].name, sizeof students[i].name);
        outfile.write((char*)&students[i].otch, sizeof students[i].otch);
        outfile.write((char*)&students[i].gender, sizeof students[i].gender);
        outfile.write((char*)&students[i].facul, sizeof students[i].facul);
        outfile.write((char*)&students[i].kurs, sizeof students[i].kurs);
        outfile.write((char*)&students[i].group, sizeof students[i].group);
        outfile.write((char*)&students[i].mark[0], sizeof students[i].mark[0]);
        outfile.write((char*)&students[i].mark[1], sizeof students[i].mark[1]);
        outfile.write((char*)&students[i].mark[2], sizeof students[i].mark[2]);
        outfile.write((char*)&students[i].mark[3], sizeof students[i].mark[3]);
        outfile.write((char*)&students[i].mark[4], sizeof students[i].mark[4]);
        outfile.write((char*)&students[i].city, sizeof students[i].city);
    }
 
    //вывод из бинарного файла
    cout << "После сортировки: " << endl;
    while (!outfile.eof())
    {
        for (j = 0; j < n; j++)
        {
            outfile.read((char*)&students[j].fam, sizeof students[j].fam);
            outfile.read((char*)&students[j].name, sizeof students[j].name);
            outfile.read((char*)&students[j].otch, sizeof students[j].otch);
            outfile.read((char*)&students[j].gender, sizeof students[j].gender);
            outfile.read((char*)&students[j].facul, sizeof students[j].facul);
            outfile.read((char*)&students[j].kurs, sizeof students[j].kurs);
            outfile.read((char*)&students[j].group, sizeof students[j].group);
            outfile.read((char*)&students[j].mark[0], sizeof students[j].mark[0]);
            outfile.read((char*)&students[j].mark[1], sizeof students[j].mark[1]);
            outfile.read((char*)&students[j].mark[2], sizeof students[j].mark[2]);
            outfile.read((char*)&students[j].mark[3], sizeof students[j].mark[3]);
            outfile.read((char*)&students[j].mark[4], sizeof students[j].mark[4]);
            outfile.read((char*)&students[j].city, sizeof students[j].city);
            cout << "Фамилия: " << students[j].fam << endl;
            cout << "Имя: " << students[j].name << endl;
            cout << "Отчество: " << students[j].otch << endl;
            cout << "Пол: " << students[j].gender << endl;
            cout << "Факультет: " << students[j].facul << endl;
            cout << "Курс: " << students[j].kurs << endl;
            cout << "Группа: " << students[j].group << endl;
            cout << "Оценка по программированию: " << students[j].mark[0] << endl;
            cout << "Оценка по литературе: " << students[j].mark[1] << endl;
            cout << "Оценка по математике: " << students[j].mark[2] << endl;
            cout << "Оценка по физике: " << students[j].mark[3] << endl;
            cout << "Оценка по теории алгоритмов: " << students[j].mark[4] << endl;
            cout << "Город: " << students[j].city << endl;
            cout << endl;
        }
    }
 
    outfile.close();
    system("pause");
 
    return 0;
}
Добавлено через 3 минуты
Достаточно было убрать
C++
1
while (!outfile.eof())
Но вопросы все равно есть.
Можно ли объявлять бинарный файл 1 раз и для записи, и для вывода?
вот так:
C++
1
2
3
4
5
    fstream outfile("outstructure.bin");
    if (!file.is_open()) {
        file.open("outstructure.bin", fstream::binary);
        return 0;
    }
или нужно обязательно использовать ofstream и ifstream?
как проверить корректность работы данной программы?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2016, 21:51
Ответы с готовыми решениями:

Чтение и запись бинарного файла
Добрый день! Есть задача прочитать с бинарного файла информацию, обработать ее и записать результат...

Чтение/запись бинарного файла
Надо проверить корректно ли работает стек. #include &quot;stack.h&quot; #include &lt;fstream&gt; #include...

Запись/чтение бинарного файла
Здавствуйте, помогите, пожалуйста, с чтением и записью объекта в бинарный файл. Пишут, что...

Запись и чтение структуры из бинарного файла
Проблема заключается в том, что, когда идёт запись и считка с бин. файла - нормально выводит лишь...

10
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
06.04.2016, 22:04 2
Можно 1 раз, только сбрасывай флаги clear() и указатель с помощью seekg() устанавливай на начало файла перед чтением.
И конкретно твою структуру можно записывать и считывать целиком, а не по отдельным полям.
1
1 / 1 / 0
Регистрация: 16.03.2013
Сообщений: 65
06.04.2016, 22:14  [ТС] 3
всегда перед чтение это необходимо делать? И что за флаги очищает clear()?
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
06.04.2016, 22:19 4
Для только что открытого не надо. Ну ты файл записывал и указатель будет в конце, надо его передвинуть, если файл не закрываешь. В данном случае, возможно, без clear() будет работать - но вызов не помешает. Флаг конца файла, флаг ошибок сбрасывает.
1
1 / 1 / 0
Регистрация: 16.03.2013
Сообщений: 65
06.04.2016, 22:25  [ТС] 5
если предварительно не создаю в папке программы файл outstructure.bin, то программа все равно работает и выводит все на экран. Значит работает не правильно. Где возможна ошибка? Ведь, делаю как положено: открыл, записал, считал, закрыл.
Не могли бы вы просмотреть код, где я мог напортачить?
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
06.04.2016, 22:30 6
bin создаёт твоя программа - не требуется, чтобы он существовал до запуска.
0
1 / 1 / 0
Регистрация: 16.03.2013
Сообщений: 65
06.04.2016, 22:30  [ТС] 7
нашел ошибку
C++
1
2
3
4
5
    fstream outfile("outstructure.bin");
    if (!file.is_open()) {
        file.open("outstructure.bin", fstream::binary);
        return 0;
    }
после исправления на
C++
1
2
3
4
5
    fstream outfile("outstructure.bin");
    if (!outfile.is_open()) {
        outfile.open("outstructure.bin", fstream::binary);
        return 0;
    }
программа после запуска сразу закрывается с кодом 0 (0x0)
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
06.04.2016, 22:37 8
Этого хватит:
C++
1
2
fstream outfile("outstructure.bin", fstream::binary);
if (!outfile) return 1;
0
1 / 1 / 0
Регистрация: 16.03.2013
Сообщений: 65
06.04.2016, 22:42  [ТС] 9
Цитата Сообщение от nmcf Посмотреть сообщение
Этого хватит:
теперь завершилась с кодом.
По -видимому он не создает файл .bin
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
06.04.2016, 22:47 10
Лучший ответ Сообщение было отмечено dan-man007 как решение

Решение

Ну тогда создай его заранее или используй раздельные ofstream/ifstream для записи/чтения.
1
1 / 1 / 0
Регистрация: 16.03.2013
Сообщений: 65
06.04.2016, 23:00  [ТС] 11
Цитата Сообщение от nmcf Посмотреть сообщение
Ну тогда создай его заранее или используй раздельные ofstream/ifstream для записи/чтения.
когда использую раздельные ofstream и ifstream студия начинает жаловаться на outfile.read; пишет, что ofstream не содержит read.
Когда заранее создал файл в sublime text, то все заработала и выводит только из бинарного файла. большое спасибо Вам
0
06.04.2016, 23:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2016, 23:00
Помогаю со студенческими работами здесь

Чтение/запись бинарного файла: необработаное исключение
Здравствуйте. Есть данный код: #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif ...

Чтение из бинарного файла и запись в него вектора чисел
Всем доброго времени суток форумчане!:) Есть код который читает из двух файлов два вектора...

Запись и чтение из бинарного файла, объяснить поведение программы
Добрый день! Подскажите, есть код #include &lt;fstream&gt; #include &lt;iostream&gt; using namespace...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru