1 / 1 / 4
Регистрация: 08.08.2013
Сообщений: 86
1

Бинарный ввод\вывод в файл

13.02.2015, 18:39. Показов 2295. Ответов 8
Метки нет (Все метки)

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
#include <fstream>
#include <iostream>
#include <conio.h>
using namespace std;
class Person
{
private:
    char name[80];
    unsigned short age;
public:
    void get_data()
    {
        cout << "Name: "; cin >> name;
        cout << "Age: "; cin >> age;
    }
    void set_data()
    {
        cout << "\nName = " << name << "\nAge = " << age << endl;
    }
};
 
void main()
{
    Person pers,pers2;
    char live;
    fstream file;
    int x = 0;
    file.open("GROUP.DAT", ios::binary | ios::app | ios::in | ios::out);
    do
    {
        cout << "\nInput data about human:\n";
        pers.get_data();
        file.write((char*)&pers, sizeof(pers));
        cout << "Next?(y/n) -> "; live = _getch();
        x = x + sizeof(pers);
        file.seekg(x);
    } while (live != 'N' && live != 'n');
    file.seekg(0);
    while (!file.eof())
    {
        cout << "\nPerson: ";
        file.read((char*)&pers2, sizeof(pers2));
        pers.set_data(); cout << endl;
    }
    _getch();
 
}
код должен запросить много раз данные , записать их ВСЕ в файл, бинарно. А потом вывести.
А здесь он запрашивает, и выводит кучу раз, только последние данные. Как исправить ? Помоигтеее
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2015, 18:39
Ответы с готовыми решениями:

Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод)
Здравствуйте. Стоит задача записать в бинарный файл массив объектов student: class student {...

Ввод и вывод структуры в бинарный файл
Всем привет, друзья! Как вообще происходит Ввод и вывод структуры в бинарный файл. Можете...

Ввод/вывод структуры в текстовый и бинарный файл
есть код #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include...

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

8
7376 / 6295 / 2859
Регистрация: 14.04.2014
Сообщений: 27,290
13.02.2015, 20:15 2
Класс замени на структуру.
После 14-й строки добавь cin.get();
Строки 35 и 36 удали.
1
109 / 84 / 55
Регистрация: 01.02.2014
Сообщений: 281
13.02.2015, 20:16 3
Лучший ответ Сообщение было отмечено Spirit370 как решение

Решение

в 43 строке замени pers на pers2
1
1 / 1 / 4
Регистрация: 08.08.2013
Сообщений: 86
14.02.2015, 11:47  [ТС] 4
С этим разобрался. Но теперь программа читает из файла последний записанный объект два раза , а все , которые записаны до него, только один. Как сделать, чтоб читалось всё по одному разу?
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
#include <fstream>
#include <iostream>
#include <conio.h>
using namespace std;
class Person
{
private:
    char name[80];
    unsigned short age;
public:
    void get_data()
    {
        cout << "Name: "; cin >> name;
        cout << "Age: "; cin >> age;
        cin.sync();
    }
    void set_data()
    {
        cout << "\nName = " << name << "\nAge = " << age << endl;
    }
};
void main()
{
    Person pers,pers2;
    char live;
    fstream file;
    file.sync();
    int x = 0;
    file.open("GROUP.DAT", ios::out | ios::trunc);
    file.close();
    file.open("GROUP.DAT", ios::in | ios::binary | ios::app | ios::in);
    do
    {
        cout << "\nInput data about human:\n";
        pers.get_data();
        file.write(reinterpret_cast<char*>(&pers), sizeof(pers));
        cout << "Next?(y/n) -> "; live = _getch();
    } while (live != 'N' && live != 'n');
    file.seekg(0);
    while (!file.eof())
    {
        cout << "\nPerson: ";
        file.read(reinterpret_cast<char*>(&pers2), sizeof(pers2));
        pers2.set_data(); cout << endl;
    }
    _getch();
}
0
7376 / 6295 / 2859
Регистрация: 14.04.2014
Сообщений: 27,290
14.02.2015, 11:57 5
Лучший ответ Сообщение было отмечено Spirit370 как решение

Решение

Сделай так:
C++
1
2
3
4
5
6
7
    while (true)
    {
        cout << "\nPerson: ";
        file.read(reinterpret_cast<char*>(&pers2), sizeof(pers2));
        if (file.eof()) break;
        pers2.set_data(); cout << endl;
    }
Ещё раз: не следует записывать класс целиком, это не структура.
1
1 / 1 / 4
Регистрация: 08.08.2013
Сообщений: 86
14.02.2015, 12:07  [ТС] 6
Тоже верно! А я ещё так придумал
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
void main()
{
    Person pers,pers2;
    char live;
    fstream file;
    file.sync();
    int x = 0;
    file.open("GROUP.DAT", ios::out | ios::trunc);
    file.close();
    file.open("GROUP.DAT", ios::in | ios::binary | ios::app | ios::in);
    do
    {
        cout << "\nInput data about human:\n";
        pers.get_data();
        file.write(reinterpret_cast<char*>(&pers), sizeof(pers));
        cout << "Next?(y/n) -> "; live = _getch();
    } while (live != 'N' && live != 'n');
    file.put(';'); // В конец файла пишем ";";
    file.seekg(0);
    while (!file.eof())
    {
        file.get(live);
        if (live == ';')  break; //Нашли ';' ?  Выходим из цикла
        file.unget(); // возвращаем забранный символ
        cout << "\nPerson: ";
        file.read(reinterpret_cast<char*>(&pers2), sizeof(pers2));
        pers2.set_data(); cout << endl;
    }
    _getch();
}
Обозначать конец файла символом, и выходить из цикла , если его нашли.
Но твой способ короче. Да...
0
7376 / 6295 / 2859
Регистрация: 14.04.2014
Сообщений: 27,290
14.02.2015, 12:12 7
Обычно для бинарного файла, состоящего из структур, вычисляют размер, делят на длину структуры и считывают циклом for со счётчиком.
1
1 / 1 / 4
Регистрация: 08.08.2013
Сообщений: 86
14.02.2015, 12:36  [ТС] 8
C++
1
2
3
4
5
6
7
8
9
file.seekg(0);
    int siz = (sizeof(file)/sizeof(Person));
    cout << siz; _getch();
    for (int i = 0; i < siz; i++)
    {
        file.read(reinterpret_cast<char*>(&pers2), sizeof(pers2));
        cout << "\nPerson: ";
        pers2.set_data(); cout << endl;
    }
Так не получилось, siz постоянно равен двум
0
7376 / 6295 / 2859
Регистрация: 14.04.2014
Сообщений: 27,290
14.02.2015, 14:05 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    file.seekg (0, file.end);
    int length = file.tellg();
    file.seekg (0, file.beg);
    file.clear();
 
    int siz = (length / sizeof(Person));
    cout << siz; _getch();
    for (int i = 0; i < siz; i++)
    {
        file.read(reinterpret_cast<char*>(&pers2), sizeof(pers2));
        cout << "\nPerson: ";
        pers2.set_data(); cout << endl;
    }
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2015, 14:05
Помогаю со студенческими работами здесь

Потоки. Бинарный ввод/вывод
Нужно написать бинарный вывод в файл. По учебнику вроде бы что-то в этом роде: ofstream...

Вывод в бинарный файл
Надо вывести последовательность 0 и 1 в бинарный файл так чтобы это был двоичный код,т.е. каждый...

Бинарный файловый ввод/вывод: реализовать операции для работы с массивом структур типа WORKER
Здравствуйте, видел очень много подобных программ, но у меня особый случай в общем суть программы:...

Сконвертировать текстовый файл в бинарный, переписать только положительные числа в другой бинарный файл
Бинарные файлы!! Помогите пожалуйста. Дано бинарный файл ( данные сначала в текстовом, конвертирую...


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

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

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