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

Бинарный файл

27.04.2017, 19:13. Просмотров 198. Ответов 10

В файл, помимо нужного, записывается, почему-то, буква "М", что не так?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void add(fstream& stream, SportBeg& sportBeg, int n)
{
    stream.clear();
 
    try
    {
        stream.write((char*)&sportBeg, sizeof(sportBeg));
 
    }
    catch (...)
    {
        cerr << L"Ошибка";
        exit(0);
    }
}
Структура:

C++ (Qt)
1
2
3
4
5
6
7
8
9
struct SportBeg
{
    TCHAR fam[LenFam];
    TCHAR sport[LenSport];
    TCHAR pob1[LenFam];
    TCHAR pob2[LenFam];
    TCHAR pob3[LenFam];
    int del;
};
Вызов функции add:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
                cout<<TEXT("Количество записей: ");
                cin >> n;
                cout<<hat;
    
                for (int i=0;i<n;i++)
                {
                    cout<<endl<<i+1<<TEXT("-ая запись: ")<<endl;
    
                    cin>>sportBeg.fam>>sportBeg.sport>>sportBeg.pob1>>sportBeg.pob2>>sportBeg.pob3;
 
                    sportBeg.del=0;
                    add(stream,sportBeg);
                }
Ещё и считывается как-то не особо корректно...
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void PrintInTable(fstream &stream, int p)
{
    stream.clear();
    stream.seekg(0,ios::beg);
    SportBeg sportBeg;
    int ip; 
    cout<<hat;
    for(ip=p;read(stream,sportBeg);ip--)
    {   
        PrintInLine(sportBeg);
        if (ip==1)
        {   
            ip=p+1;
            cout<<ask;
            getch();
            system("cls");
            cout<<hat;
 
        }
    }
        cout<<ask;
        getch();
}
C++ (Qt)
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
fstream& read(fstream& stream, SportBeg &sportBeg, int n)
{
    
    stream.clear();
 
 
    /*if (n)
            stream.seekg((n-1)*LenRec);*/
 
    stream.read((char*)&sportBeg,sizeof(sportBeg));
 
            //stream
            //>>setw(LenFam)>>sportBeg.fam
            //>>setw(LenSport)>>sportBeg.sport
            //>>setw(LenFam)>>sportBeg.pob1
            //>>setw(LenFam)>>sportBeg.pob2
            //>>setw(LenFam)>>sportBeg.pob3
            //>>setw(2)>>sportBeg.del;
 
    if (!stream &&!stream.eof())
    {
        getch();
        exit(0);
    }
    return stream;
 
}
Добавлено через 57 секунд
Причем, с txt все было идеально...
Поменял функции add и read и больше ничего не работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2017, 19:13
Ответы с готовыми решениями:

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

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

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

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

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

10
h3mbr0
294 / 104 / 30
Регистрация: 12.03.2012
Сообщений: 419
27.04.2017, 19:28 #2
А что должно вводиться/выводиться то? fstream открывается с ios::binary? вообще хранить структуру в файле без сериализации плохо, в ней не определены отступы(padding) между ее членами
как минимум нужно задавать выравнивание
C++
1
2
3
#pragma pack(push, 1)
//struct Foo {...}
#pragma pack(pop)
1
nd2
2831 / 2400 / 1055
Регистрация: 29.01.2016
Сообщений: 8,037
27.04.2017, 19:36 #3
Цитата Сообщение от Monolag Посмотреть сообщение
В файл, помимо нужного, записывается, почему-то, буква "М", что не так?
Это бинарная запись. Ты же строки не полностью заполняешь, вот "хвосты" и будут, в блокноте, выглядеть как M (int - тоже не символы). Бинарный файл не предназначен для разглядывания в текстовых редакторах. Запись проверяется чтением, или смотри содержимое hex-редактором.
1
nmcf
6265 / 5575 / 2534
Регистрация: 14.04.2014
Сообщений: 23,468
27.04.2017, 19:36 #4
Убери эти try/catch, а exit() - вообще древняя функция из C.
1
Monolag
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 47
27.04.2017, 19:51  [ТС] #5
h3mbr0, fstream открывается с binary, да
В txt у меня были отступы, но это было легко реализовать при записи/чтении
А с бинарным что делать? Выравнивание просто?
nd2, хорошо, спасибо, буду знать.
Получается, что просто не считывается адекватно...
Может дело в функции PrintInTable?
nmcf, ладно, убрал, но если файла нет или он не открывается? Обрабатывать это в main?

Добавлено через 1 минуту
Преподаватель обещала, что при изменении функций записи или чтения в/из txt на
stream.read((char*)&sportBeg,sizeof(sportBeg)) / stream.write((char*)&sportBeg,sizeof(sportBeg))
Все будет отлично работать с:
0
nd2
2831 / 2400 / 1055
Регистрация: 29.01.2016
Сообщений: 8,037
27.04.2017, 19:52 #6
Цитата Сообщение от Monolag Посмотреть сообщение
А с бинарным что делать?
Ничего не делать.
Цитата Сообщение от Monolag Посмотреть сообщение
Выравнивание просто?
Для одной программы можно и не выравнивать, работать будет правильно и без этого.
1
h3mbr0
294 / 104 / 30
Регистрация: 12.03.2012
Сообщений: 419
27.04.2017, 19:52 #7
Цитата Сообщение от Monolag Посмотреть сообщение
А с бинарным что делать?
Как минимум задать pack(1), иначе если длины массивов некратны размеру инта(это если выравнивание по дефолту по большему элементу), в файл будет писаться мусор даже если массивы почистить, а главное - на разных машинах могут быть разные отступы
Цитата Сообщение от Monolag Посмотреть сообщение
но если файла нет или он не открывается?
is_open()

Вообще если надо просто строки хранить, то определенно незачем делать это в бинарном виде
1
nmcf
6265 / 5575 / 2534
Регистрация: 14.04.2014
Сообщений: 23,468
27.04.2017, 19:53 #8
Цитата Сообщение от Monolag Посмотреть сообщение
Обрабатывать это в main?
Да.
1
nd2
2831 / 2400 / 1055
Регистрация: 29.01.2016
Сообщений: 8,037
27.04.2017, 19:54 #9
Цитата Сообщение от Monolag Посмотреть сообщение
Обрабатывать это в main?
Обрабатывай.
1
h3mbr0
294 / 104 / 30
Регистрация: 12.03.2012
Сообщений: 419
27.04.2017, 19:58 #10
Цитата Сообщение от Monolag Посмотреть сообщение
Преподаватель обещала, что при изменении функций записи или чтения в/из txt на
stream.read((char*)&sportBeg,sizeof(sportBeg)) / stream.write((char*)&sportBeg,sizeof(sportBeg))
Все будет отлично работать с:
Опять же, если задать pack(1) - то так и будет(и без него будет, но не везде), только не ждите что в файле все будет читабельно, это будет просто бинарь для хранения данных
1
Monolag
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 47
27.04.2017, 20:03  [ТС] #11
Хорошо, всем большое спасибо, буду разбираться)
0
27.04.2017, 20:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2017, 20:03

Бинарный файл
Привет всем:) Помогите пожалуйста разобраться! Задача: Дан символьный файл....

Бинарный файл
Всем добрый день. Почему программа не записывает в бинарном формате? ...

С++ Бинарный файл
Нужно написать программу на visual studio 10 c++ которая записивала числа в...


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

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

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