Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
almazuulu
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 77
Завершенные тесты: 1
#1

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

24.08.2016, 13:58. Просмотров 877. Ответов 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
Ответы с готовыми решениями:

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

Как правильно сохранить и потом считать структуру в бинарный файл
Есть структура struct card { int size; char *lear; int *name; }; Эта...

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

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

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

9
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
24.08.2016, 14:21 #2
Лучший ответ Сообщение было отмечено almazuulu как решение

Решение

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
2833 / 2401 / 1056
Регистрация: 29.01.2016
Сообщений: 8,038
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
1334 / 827 / 747
Регистрация: 06.02.2016
Сообщений: 2,205
Записей в блоге: 17
Завершенные тесты: 4
24.08.2016, 16:11 #4
Лучший ответ Сообщение было отмечено almazuulu как решение

Решение

Как вариант
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
2833 / 2401 / 1056
Регистрация: 29.01.2016
Сообщений: 8,038
24.08.2016, 16:14 #5
Цитата Сообщение от Peoples Посмотреть сообщение
Как вариант
Память под string записываешь в файл? И что там?
0
almazuulu
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 77
Завершенные тесты: 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
Сообщений: 77
Завершенные тесты: 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
2833 / 2401 / 1056
Регистрация: 29.01.2016
Сообщений: 8,038
25.08.2016, 04:13 #8
Лучший ответ Сообщение было отмечено almazuulu как решение

Решение

Цитата Сообщение от almazuulu Посмотреть сообщение
но вот последнее имя повторяется дважды
Цитата Сообщение от almazuulu Посмотреть сообщение
надо было оказывается вот так сделать
Был совет на эту тему:
Цитата Сообщение от nd2 Посмотреть сообщение
Чтение первого поля помести в параметры while():
C++
1
2
while(in >> userInfo.id)
{
Добавлено через 11 минут
И не вздумай string-и использовать, если используешь бинарную запись в файл.
0
almazuulu
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 77
Завершенные тесты: 1
25.08.2016, 09:14  [ТС] #9
nd2, о спасибо большое! ))) реально не заметил оказывается. тоже полезно запомнить, возьму на заметку
0
Peoples
1334 / 827 / 747
Регистрация: 06.02.2016
Сообщений: 2,205
Записей в блоге: 17
Завершенные тесты: 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

Не получается открыть бинарный файл
Всем привет! Есть класс Garage! у него приватное поле string name и поле...

Чтение/Запись в текстовый и бинарный файл.
Подскажите в чем ошибка. Функции чтения и записи в бинарный и текстовый файл...

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


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

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

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