Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
13 / 13 / 10
Регистрация: 23.08.2015
Сообщений: 131
1

Считывание из бинарного файла в структуру с последующим выводом

19.12.2016, 21:18. Показов 6474. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В бинарном файле храниться инфа:
Имя_пользователя дата_подключения номер
Имя_пользователя дата_подключения номер
и т.д.

Есть некая структура
C++
1
2
3
4
5
6
struct User
{
    string name;
    string date;
    string phoneNumber; 
};
Цель: считать из файла инфу и потом вывести её на экран.
Начал вот с чего то такого, но Выдаёт ошибку на & и на "<<" в cout.


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
#include <iostream>
#include <fstream>
#include <stdio.h>
 
using namespace std;
 
struct User
{
    string name;
    string date;
    string phoneNumber; 
};
 
 
int main()
{
    fstream binar("binary.bin", ios_base::binary || ios_base::out);
    User pb;
 
    binar.write(&pb, sizeof(User));
 
    cout << pb.name << pb.date << pb.phoneNumber << "\n";
 
    binar.close();
 
    system("pause");
    return 0;
 
}
Как выполнить это правильно?

Добавлено через 1 час 18 минут
Дошёл до этого, но всё равно не работает
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
#include <iostream>
#include <fstream>
#include <stdio.h>
 
using namespace std;
 
struct User
{
    char name[20];
    char phoneNumber[20];
} pb;
 
int main()
{
    ifstream file("text.txt");
    fstream binary("binary.bin", ios_base::binary);
 
    binary.clear();
 
    while (!file.eof())
    {
        char buff[50];
 
        file.getline(buff, 50);
 
        binary << buff;
    }
 
    file.close();
 
    binary.seekg(0, ios_base::beg);
    
        binary.write((char *)(&pb), sizeof(User));
    
 
    cout << pb.name << pb.phoneNumber << endl;
    
 
    binary.close();
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2016, 21:18
Ответы с готовыми решениями:

Что-то не то с выводом сохранённых данных из бинарного файла
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include...

Считывание из бинарного файла
СЧИТАТЬ ИЗ БИНАРНОГО ФАЙЛА ВСЕ ВЕЩЕСТВЕННЫЕ ЧИСЛА В МАССИВ И ВЫВЕСТИ ЕГО НА ЭКРАН. #include...

Считывание бинарного файла
Здравствуйте! Изначально нужно было прочитать почисленно текстовый файл и забить его в массив. Но...

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

4
104 / 98 / 40
Регистрация: 01.07.2012
Сообщений: 277
19.12.2016, 22:17 2
Если переделать на функции или методы класса, то будет красивее

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
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
 
using namespace std;
 
struct User
{
    string name;
    string date;
    string phoneNumber;
};
 
int main()
{
    // Запись
    ofstream os("binary.bin", ios_base::binary);
    User pb1 = { "MyName", "01.01.1900", "+7(912)345-67-89" };
 
    size_t strSize;
 
    strSize = pb1.name.size();
    os.write( (char *)&strSize, sizeof(size_t) );
    os.write( pb1.name.data(), pb1.name.size() );
 
    strSize = pb1.date.size();
    os.write( (char *)&strSize, sizeof(size_t) );
    os.write( pb1.date.data(), pb1.date.size() );
 
    strSize = pb1.phoneNumber.size();
    os.write( (char *)&strSize, sizeof(size_t) );
    os.write( pb1.phoneNumber.data(), pb1.phoneNumber.size() );
 
    os.close();
 
    // Чтение
    ifstream is("binary.bin", ios_base::binary);
    User pb2;
    vector<char> buffer;
 
    is.read( (char *)&strSize, sizeof(size_t) );
    buffer.resize(strSize);
    is.read( buffer.data(), buffer.size() );
    pb2.name = string(buffer.data(), buffer.size());
 
    is.read( (char *)&strSize, sizeof(size_t) );
    buffer.resize(strSize);
    is.read( buffer.data(), buffer.size() );
    pb2.date = string(buffer.data(), buffer.size());
 
    is.read( (char *)&strSize, sizeof(size_t) );
    buffer.resize(strSize);
    is.read( buffer.data(), buffer.size() );
    pb2.phoneNumber = string(buffer.data(), buffer.size());
 
    is.close();
 
    cout << pb2.name << " " << pb2.date << " " << pb2.phoneNumber << endl;
 
    system("pause");
    return 0;
}
1
13 / 13 / 10
Регистрация: 23.08.2015
Сообщений: 131
20.12.2016, 00:52  [ТС] 3
Vaiz, мне это надо без векторов, к сожалению..

Добавлено через 40 минут
Актуально..

Добавлено через 1 час 32 минуты
Чё, никто не знает?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
20.12.2016, 03:34 4
Лучший ответ Сообщение было отмечено neketsh как решение

Решение

neketsh, твой код не изучал, но, увидев поля структуры типа string и требование бинарной записи/чтения: структуры с такими полями не годятся для простых методов бинарного записи/чтения.

Добавлено через 6 минут
Если насчёт этого:
Цитата Сообщение от neketsh Посмотреть сообщение
Дошёл до этого, но всё равно не работает
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
struct User
{
    char name[20];
    char phoneNumber[20];
} pb;
 
int main()
{
    // файлы должны существовать, исходные данные ("file.txt"): в каждой строке, через пробел, из одного слова, имя и телефон
    ifstream file("text.txt");
    fstream binary("binary.bin", ios::in | ios::out | ios_base::binary);
    if (!file || !binary)
    {
        cout << "Error opening file!" << endl;
        system("pause");
        return 0;
    }
    
    while (file >> pb.name)
    {
        file >> pb.phoneNumber;
        binary.write((const char*)&pb, sizeof(pb));
    }
    binary.flush();
    file.close();
    
    User pbb;
    binary.seekg(0, ios_base::beg);
    
    while (binary.read((char *)(&pbb), sizeof(pb)))
        cout << pbb.name << ' ' << pbb.phoneNumber << endl;
    
     binary.close();
    
    system("pause");
    return 0;
}
1
104 / 98 / 40
Регистрация: 01.07.2012
Сообщений: 277
20.12.2016, 09:47 5
Цитата Сообщение от neketsh Посмотреть сообщение
Vaiz, мне это надо без векторов, к сожалению..
ну так заменить вектор на массив не сложно

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
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
 
using namespace std;
 
struct User
{
    string name;
    string date;
    string phoneNumber;
};
 
int main()
{
    // Запись
    ofstream os("binary.bin", ios_base::binary);
    User pb1 = { "MyName", "01.01.1900", "+7(912)345-67-89" };
 
    size_t strSize;
 
    strSize = pb1.name.size();
    os.write( (char *)&strSize, sizeof(size_t) );
    os.write( pb1.name.data(), pb1.name.size() );
 
    strSize = pb1.date.size();
    os.write( (char *)&strSize, sizeof(size_t) );
    os.write( pb1.date.data(), pb1.date.size() );
 
    strSize = pb1.phoneNumber.size();
    os.write( (char *)&strSize, sizeof(size_t) );
    os.write( pb1.phoneNumber.data(), pb1.phoneNumber.size() );
 
    os.close();
 
    // Чтение
    ifstream is("binary.bin", ios_base::binary);
    User pb2;
    char buffer[1024];
 
    is.read( (char *)&strSize, sizeof(size_t) );
    is.read( buffer, strSize );
    pb2.name = string(buffer, strSize);
 
    is.read( (char *)&strSize, sizeof(size_t) );
    is.read( buffer, strSize );
    pb2.date = string(buffer, strSize);
 
    is.read( (char *)&strSize, sizeof(size_t) );
    is.read( buffer, strSize );
    pb2.phoneNumber = string(buffer, strSize);
 
    is.close();
 
    cout << pb2.name << " " << pb2.date << " " << pb2.phoneNumber << endl;
 
    system("pause");
    return 0;
}
1
20.12.2016, 09:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2016, 09:47
Помогаю со студенческими работами здесь

Считывание данных из бинарного файла
Доброго времени суток. Моя проблема уже была озвучена в теме. Вот листинг функции которая...

Запись и считывание из бинарного файла
Допустим я реализовываю АТД - контейнер. Там будет функция обновления (Все данные скопировать в...

Считывание структуры из бинарного файла
Привет всем, при считывании структуры одной строкой кода и последующим выводом ее на экран...

Чтение из бинарного файла в структуру
Собственно вопрос в заголовке, есть структура: struct StructEmployee {; int id; ...


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

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