Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
almazuulu
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 75
Завершенные тесты: 1
#1

Не получается прочесть правильно текстовый файл в структуру а затем в бинарный файл - C++

24.08.2016, 13:58. Просмотров 325. Ответов 9
Метки нет (Все метки)

Нужно просто прочесть файл в структуру данных а потом оттуда записать в бинарный файл
Вот как выглядит текстовый файл:

11122 Mary Jane 4.6
43299 Peter Parker 12.5
28800 Harry Osborne 9.8
22245 Pokemon Go 10.5
12354 Van Damme 9.3
14443 Dohnald Trump 8.2
45633 Vladimir Putin 5.5
56632 Usain Bolt 4.7

А вот мой код:

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
#include <iostream>
#include <fstream>
#include <cstring>
#include <iomanip>
using namespace std;
 
struct intUsers
{
    int id;
    char userName[20];
    char userSecName[20];
    float timeOfConnect;
};
 
int main()
{
intUsers userInfo;
 
int x=0;
char fileName_binary[50];
 
cout<<"type the name for binary file: "<<endl;
cin>>fileName_binary;
ofstream out(fileName_binary, ios::binary);
 
ifstream in("internetUsers.txt");
    while(in)
    {
            in >> userInfo.id;
            in.get(userInfo.userName,20);
            in.get(userInfo.userSecName,20);
             in.ignore(100,'\n');
            in >> userInfo.timeOfConnect;
 
 
            cout<<" "<<userInfo.id;
            cout<<" "<<userInfo.userName;
            cout<<" "<<userInfo.userSecName;
            cout<<" "<<userInfo.timeOfConnect<<endl;
 
 
            out.write((char *)&userInfo, sizeof(userInfo));
     }
 
return 0;
}
Не могу понять что не так с моим кодом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2016, 13:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не получается прочесть правильно текстовый файл в структуру а затем в бинарный файл (C++):

Как правильно сохранить и потом считать структуру в бинарный файл - C++
Есть структура struct card { int size; char *lear; int *name; }; Эта структура это карты игрока. Заполняем ее данными, у...

Данные записать в файл F1.txt, затем прочитать оттуда, обрабатывались и записывались в бинарный файл F2.bin с проверкой - C++
Никак не получается отладить в BC++ 3.1. Как сделать в классах так, чтобы введённые данные записывались в файл F1.txt, затем читались...

Создать бинарный файл и текстовый файл - C++
Вот, к примеру, я написал программу для введения 5 чисел в текстовый файл, а как будет выглядеть программа бинарного файла? ...

Записать структуру в бинарный файл - C++
Всем доброго времени суток. у меня такая проблема, мне нужно перекинуть в бинарный файл структуру. Структуру создала, все сделала. Файл...

Не получается открыть бинарный файл - C++
Всем привет! Есть класс Garage! у него приватное поле string name и поле fstream inv; Есть метод для записи имени в файл: void...

Чтение/Запись в текстовый и бинарный файл. - C++
Подскажите в чем ошибка. Функции чтения и записи в бинарный и текстовый файл толком не работают( Вот программа: HEADER.H ...

9
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
24.08.2016, 14:21 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
struct intUsers
{
    int id;
    char userName[20]; // <--- ?
    char userSecName[20]; // <--- ?
    float timeOfConnect;
};
Если уж пользуешься С++, то зачем эта возня с массивами char? Используй std::string.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string>
 
struct intUsers
{
    int id;
    std::string userName;
    std::string userSecName;
    float timeOfConnect;
};
 
//...
 
    in >> userInfo.id;
    in >> userInfo.userName;
    in >> userInfo.userSecName;
    in >> userInfo.timeOfConnect
1
nd2
2817 / 2387 / 848
Регистрация: 29.01.2016
Сообщений: 7,981
24.08.2016, 14:55 #3
Цитата Сообщение от John Prick Посмотреть сообщение
Если уж пользуешься С++, то зачем эта возня с массивами char? Используй std::string.
Ему нужно структуры бинарным методом записывать.

Добавлено через 2 минуты
Цитата Сообщение от almazuulu Посмотреть сообщение
Не могу понять что не так с моим кодом
А что не так?

Добавлено через 3 минуты
Сделай проверку открытия файла для чтения. Это лишнее:
Цитата Сообщение от almazuulu Посмотреть сообщение
in.ignore(100,'\n');
Чтение первого поля помести в параметры while():
C++
1
2
3
 
    while(in >> userInfo.id)
    {
И get() не используй, раз отдельные слова читаешь, используй >>.
1
Peoples
1222 / 727 / 454
Регистрация: 06.02.2016
Сообщений: 1,951
Записей в блоге: 14
Завершенные тесты: 4
24.08.2016, 16:11 #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
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
struct marvel {
    int id;
    string name;
    string surname;
    double time;
};
int main() {
    marvel comics;
    vector<marvel>val;
    ifstream ff;
    int i;
    string n,s;
    double h;
    ff.open("mar.txt");  // файл откуда читаем в структуру 
    while(!ff.eof()) {
        ff>>i>>n>>s>>h;
        comics.id=i;
        comics.name=n;
        comics.surname=s;
        comics.time=h;
        val.push_back(comics);
    }
    ff.close();
    ofstream outf("heros.txt",ios::binary| ios::in | ios::out);
    for(vector<marvel>::iterator iter=val.begin(); iter!=val.end(); iter++) {
        outf.write(reinterpret_cast<char*>(&iter),sizeof(iter));
        cout<<iter->id<<" "<<iter->name<<" "<<iter->surname<<" "<<iter->time<<endl;
    }
    return 0;
}
Добавлено через 57 минут
Или чуть проще
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
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
struct marvel {
    int id;
    string name;
    string surname;
    double time;
};
int main() {
    marvel comics;
    vector<marvel>val;
    ifstream ff;
    int i;
    string n,s;
    double h;
    ff.open("mar.txt");  // файл откуда читаем в структуру
    while(!ff.eof()) {
        ff>>i>>n>>s>>h;
        comics.id=i;
        comics.name=n;
        comics.surname=s;
        comics.time=h;
        val.push_back(comics);
    }
    ff.close();
    ofstream outf("heros.txt",ios::binary);
    for(vector<marvel>::iterator iter=val.begin(); iter!=val.end(); iter++) {
        comics=*iter;
        outf.write(reinterpret_cast<char*>(&comics),sizeof(comics));
    }
    outf.close();
    ifstream is("heros.txt",ios::binary);
    while(!is.eof()) {
        is.read(reinterpret_cast<char*>(&comics),sizeof(comics));
        cout<<comics.id<<" "<<comics.name<<" "<<comics.surname<<" "<<comics.time<<endl;
    }
    return 0;
}
1
nd2
2817 / 2387 / 848
Регистрация: 29.01.2016
Сообщений: 7,981
24.08.2016, 16:14 #5
Цитата Сообщение от Peoples Посмотреть сообщение
Как вариант
Память под string записываешь в файл? И что там?
0
almazuulu
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 75
Завершенные тесты: 1
25.08.2016, 03:37  [ТС] #6
John Prick,nd2, Peoples, Спасибо за ответ, вышло почти то что ожидал, но вот последнее имя повторяется дважды.
Вот, мой код что я исправил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while(in)
    {
            in >> userInfo.id;
            in>>userInfo.userName;
            in>>userInfo.userSecName;
            in >> userInfo.timeOfConnect;
 
 
            cout<<" "<<userInfo.id;
            cout<<" "<<userInfo.userName;
            cout<<" "<<userInfo.userSecName;
            cout<<" "<<userInfo.timeOfConnect<<endl;
 
 
            out.write((char *)&userInfo, sizeof(userInfo));
     }
а вот, что выдает в результате. Нельзя сделать, чтобы последнее имя появилось только один раз?

Не получается прочесть правильно текстовый файл в структуру а затем в бинарный файл
0
almazuulu
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 75
Завершенные тесты: 1
25.08.2016, 03:45  [ТС] #7
Все, спасибо всем!ь Наконец-то все получилось, надо было оказывается вот так сделать и дописать лишь одну строку кода.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 while(in)
    {
            in>>userInfo.id;
            in>>userInfo.userName;
            in>>userInfo.userSecName;
            in>>userInfo.timeOfConnect;
            in.ignore(100,'\n');
 
 
            cout<<" "<<userInfo.id;
            cout<<" "<<userInfo.userName;
            cout<<" "<<userInfo.userSecName;
            cout<<" "<<userInfo.timeOfConnect<<endl;
 
 
            out.write((char *)&userInfo, sizeof(userInfo));
     }
0
nd2
2817 / 2387 / 848
Регистрация: 29.01.2016
Сообщений: 7,981
25.08.2016, 04:13 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от almazuulu Посмотреть сообщение
но вот последнее имя повторяется дважды
Цитата Сообщение от almazuulu Посмотреть сообщение
надо было оказывается вот так сделать
Был совет на эту тему:
Цитата Сообщение от nd2 Посмотреть сообщение
Чтение первого поля помести в параметры while():
C++
1
2
while(in >> userInfo.id)
{
Добавлено через 11 минут
И не вздумай string-и использовать, если используешь бинарную запись в файл.
0
almazuulu
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 75
Завершенные тесты: 1
25.08.2016, 09:14  [ТС] #9
nd2, о спасибо большое! ))) реально не заметил оказывается. тоже полезно запомнить, возьму на заметку
0
Peoples
1222 / 727 / 454
Регистрация: 06.02.2016
Сообщений: 1,951
Записей в блоге: 14
Завершенные тесты: 4
25.08.2016, 10:11 #10
almazuulu,
C++
1
2
3
4
5
6
ifstream is("heros.txt",ios::binary);
    is.read(reinterpret_cast<char*>(&comics),sizeof(comics));
    while(!is.eof()) {
        cout<<comics.id<<" "<<comics.name<<" "<<comics.surname<<" "<<comics.time<<endl;
        is.read(reinterpret_cast<char*>(&comics),sizeof(comics));
    }
Извиняюсь, так не будет повторяться
0
25.08.2016, 10:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2016, 10:11
Привет! Вот еще темы с ответами:

Бинарный файл, как сконвертировать в текстовый - C++
Здравствуйте, кто работал с бинарными файлами , не nодскажете какой нибудь гайд nо работе с ними или как можно конвертировать их в...

Как открыть бинарный файл, не зная его структуру? - C++
Можно ли как-нибудь открыть бинарный файл, не зная его структуру?

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

Дан текстовый файл, содержащий целые числа. Определить в каждой четной строке максимальное число и записать результаты в новый текстовый файл - C++
Дан текстовый файл, содержащий целые числа. Определить в каждой четной строке максимальное число и записать результаты в новый текстовый...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru