С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 47

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

27.04.2017, 19:13. Показов 1537. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.04.2017, 19:13
Ответы с готовыми решениями:

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

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

Повреждается бинарный файл при попытке его записи в другой файл
Делаю автоматизированную сборку. Для этого нужно соединить три файла в один новый. Но почему-то каждый раз в exe-файле появляется лишний...

10
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
27.04.2017, 19:28
А что должно вводиться/выводиться то? fstream открывается с ios::binary? вообще хранить структуру в файле без сериализации плохо, в ней не определены отступы(padding) между ее членами
как минимум нужно задавать выравнивание
C++
1
2
3
#pragma pack(push, 1)
//struct Foo {...}
#pragma pack(pop)
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
27.04.2017, 19:36
Цитата Сообщение от Monolag Посмотреть сообщение
В файл, помимо нужного, записывается, почему-то, буква "М", что не так?
Это бинарная запись. Ты же строки не полностью заполняешь, вот "хвосты" и будут, в блокноте, выглядеть как M (int - тоже не символы). Бинарный файл не предназначен для разглядывания в текстовых редакторах. Запись проверяется чтением, или смотри содержимое hex-редактором.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.04.2017, 19:36
Убери эти try/catch, а exit() - вообще древняя функция из C.
1
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 47
27.04.2017, 19:51  [ТС]
h3mbr0, fstream открывается с binary, да
В txt у меня были отступы, но это было легко реализовать при записи/чтении
А с бинарным что делать? Выравнивание просто?
nd2, хорошо, спасибо, буду знать.
Получается, что просто не считывается адекватно...
Может дело в функции PrintInTable?
nmcf, ладно, убрал, но если файла нет или он не открывается? Обрабатывать это в main?

Добавлено через 1 минуту
Преподаватель обещала, что при изменении функций записи или чтения в/из txt на
stream.read((char*)&sportBeg,sizeof(spor tBeg)) / stream.write((char*)&sportBeg,sizeof(spo rtBeg))
Все будет отлично работать с:
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
27.04.2017, 19:52
Цитата Сообщение от Monolag Посмотреть сообщение
А с бинарным что делать?
Ничего не делать.
Цитата Сообщение от Monolag Посмотреть сообщение
Выравнивание просто?
Для одной программы можно и не выравнивать, работать будет правильно и без этого.
1
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
27.04.2017, 19:52
Цитата Сообщение от Monolag Посмотреть сообщение
А с бинарным что делать?
Как минимум задать pack(1), иначе если длины массивов некратны размеру инта(это если выравнивание по дефолту по большему элементу), в файл будет писаться мусор даже если массивы почистить, а главное - на разных машинах могут быть разные отступы
Цитата Сообщение от Monolag Посмотреть сообщение
но если файла нет или он не открывается?
is_open()

Вообще если надо просто строки хранить, то определенно незачем делать это в бинарном виде
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.04.2017, 19:53
Цитата Сообщение от Monolag Посмотреть сообщение
Обрабатывать это в main?
Да.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
27.04.2017, 19:54
Цитата Сообщение от Monolag Посмотреть сообщение
Обрабатывать это в main?
Обрабатывай.
1
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
27.04.2017, 19:58
Цитата Сообщение от Monolag Посмотреть сообщение
Преподаватель обещала, что при изменении функций записи или чтения в/из txt на
stream.read((char*)&sportBeg,sizeof(spor tBeg)) / stream.write((char*)&sportBeg,sizeof(spo rtBeg))
Все будет отлично работать с:
Опять же, если задать pack(1) - то так и будет(и без него будет, но не везде), только не ждите что в файле все будет читабельно, это будет просто бинарь для хранения данных
1
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 47
27.04.2017, 20:03  [ТС]
Хорошо, всем большое спасибо, буду разбираться)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.04.2017, 20:03
Помогаю со студенческими работами здесь

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

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

Файл: Перенести в бинарный файл и данные из текстового...
Здравствуйте товарищи программисты. Коротко: нужно считывать информацию из текстового документа, чтобы в дальнейшем создался бинарный файл...

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

Бинарный файл
Ошибка strcpy(rb.dr, DateTimePicker1-&gt;Date.c_str()); Не могу понять, что за ошибка)


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru