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

Чтение из бинарного файла - неведомое исключение

01.11.2012, 16:14. Показов 2802. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Помоги понять почему вылетает с ошибкой:
Необработанное исключение в "0x5a93ad54 (msvcp100d.dll)" в "test_conlose.exe": 0xC0000005: Нарушение прав доступа при записи "0xfeeefeee".

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
#include <iostream>
#include <string>
#include <fstream>
 
using namespace std;
 
int main()
{
    string s1("111111"), s2("2222");
 
    ofstream save( "data.bin", ios::binary | ios::out );
 
    if( save ) 
    {
        save.write( reinterpret_cast <char *> ( &s1 ), sizeof( string ) ); 
        save.close();
    }
    else system("pause");
 
    ifstream load( "data.bin", ios::binary );
 
    if( load )
    {
        load.read( reinterpret_cast <char *> ( &s2 ), sizeof( string ) );
        load.close();
    }
 
    cout << s2 << "\n";
 
    system("pause");
    return 0;
}
Если стринг заменить на инт, то не вылетает. Объясните пожалуйста почему.
Просьба предлагать только решения на c++, через потоки.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2012, 16:14
Ответы с готовыми решениями:

Чтение/запись бинарного файла: необработаное исключение
Здравствуйте. Есть данный код: #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include &lt;iostream&gt; #include...

Чтение бинарного файла - чтение первых 9 байт
Есть код, который читает первые 9 байт бинарного файла(заголовок записи) void ATS44Encoder::FileEncode() { QFile* file = new...

Внешняя сортировка бинарного файла (чтение после конца файла невозможно)
Помогите отладить программу, не вижу, что здесь можно сделать. Похоже, курсор файла где-то в коде сортировки доходит до конца, но потом все...

38
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
01.11.2012, 17:27
у меня отлично работает этот код, компилил в билдере
0
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 8
01.11.2012, 17:34  [ТС]
в visual studio 2010 вылетает с исключением :/
0
Обитатель форума
201 / 184 / 54
Регистрация: 28.10.2012
Сообщений: 543
01.11.2012, 18:06
http://www.microsoft.com/en-us... px?id=5555

Необходимо для запуска программ, скомпилированных в MVS_2010
0
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 8
01.11.2012, 21:43  [ТС]
Сомневаюсь, что проблема в этом, так как всё остальное работает прекрасно.

Добавлено через 1 час 42 минуты
Избавился от проблемы так:

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
int main()
{
    string s1("111111"), s2("2222");
 
    ofstream save( "data.bin", ios::out | ios::binary );
 
    if( save ) 
    {
        save.write( reinterpret_cast <char *> ( &s1 ), sizeof( string ) );
        save.close();
    }
 
    ifstream load( "data.bin", ios::binary );
 
    string *s3 = new string;
 
    if( load )
    {
        load.read( reinterpret_cast <char *> ( s3 ), sizeof( string ) );
        load.close();
    }
 
    cout << *s3 << "\n";
 
//  delete s3;
 
    system("pause");
    return 0;
}
но, теперь есть ещё 1 интересный момент, если открыть комент, опять лезет та ошибка
объясните, если не сложно, почему так.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.11.2012, 22:20
Цитата Сообщение от guest658655 Посмотреть сообщение
Избавился от проблемы так:
Ни черта вы от нее не избавились.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <cstring>
 
int main()
{
    std::string str1("11111"), str2("222");
 
    std::cout << (std::memcmp(reinterpret_cast<char*>(&str2), reinterpret_cast<char*>(&str1), sizeof(std::string)) == 0) << std::endl;
 
    std::memcpy(reinterpret_cast<char*>(&str2), reinterpret_cast<char*>(&str1), sizeof(std::string));
 
    std::cout << (std::memcmp(reinterpret_cast<char*>(&str2), reinterpret_cast<char*>(&str1), sizeof(std::string)) == 0) << std::endl;
 
    return 0;
}
Суть ясна?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 22:28
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
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
 
int main()
{
    string s1("111111"), s2("2222");
    
    ofstream save("data.bin", ios::binary | ios::out);
 
    if(save) 
    {
        save.write(s1.c_str(), s1.size()); 
        save.close();
    }
    else system("pause");
 
    ifstream load( "data.bin", ios::binary );
    if (load)
    {
        load.read((char*)s2.c_str(), s2.size() );
        load.close();
    }
 
    cout << s2 << "\n";
 
    system("pause");
    return 0;
}
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.11.2012, 22:37
Цитата Сообщение от alsav22 Посмотреть сообщение
load.read((char*)s2.c_str(), s2.size() );
За это, кстати, тоже руки отрывать не мешало бы.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 23:05
За это, за что?
1
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.11.2012, 23:15
alsav22, как минимум за снятие константности.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 23:18
Цитата Сообщение от soon Посмотреть сообщение
alsav22, как минимум за снятие константности.
А как максимум? И чем, в данном случае, грозит снятие константности?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.11.2012, 23:24
Цитата Сообщение от alsav22 Посмотреть сообщение
И чем, в данном случае, грозит снятие константности?
Запись в область памяти, расположенной по указателю c_str - UB.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 23:28
Если так:
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
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
 
int main()
{
    string s1("111111"), s2("2222");
    
    ofstream save("data.bin", ios::binary | ios::out);
 
    if(save) 
    {
        
        for (int i = 0; i < s1.size(); i++)
            save.write(&s1[i], 1); 
        save.close();
    }
    else system("pause");
 
    ifstream load( "data.bin", ios::binary );
    if (load)
    {
        for (int i = 0; i < s2.size(); i++)
             load.read(&s2[i], s2.size() );
        load.close();
    }
 
    cout << s2 << "\n";
 
    system("pause");
    return 0;
}
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.11.2012, 23:36
Поторопились. Считывать надо 1 байт, а не s2.size(). Запись в файл можно было не менять, write принимает const char*.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 23:42
Исправляю:
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
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
 
int main()
{
    string s1("111111"), s2("2222");
    
    ofstream save("data.bin", ios::binary | ios::out);
 
    
    if(save) 
    {
        save.write(s1.c_str(), s1.size()); 
        save.close();
    }
    else system("pause");
 
    ifstream load( "data.bin", ios::binary );
    if (load)
    {
        for (int i = 0; i < s2.size(); i++)
             load.read(&s2[i], 1);
        load.close();
    }
 
    cout << s2 << "\n";
 
    system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 8
02.11.2012, 16:52  [ТС]
Цитата Сообщение от soon Посмотреть сообщение
Суть ясна?
Меняются местами блоки памяти, это вы имели ввиду?

Этот код выдаёт ту же ошибку.

alsav22, дело в том, что я взял стринг, как пример, мне требуется считать свою структуру. Но всёравно спасибо, это хотябы решает проблему со стрингом.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.11.2012, 17:04
guest658655, не меняются, а становятся одинаковыми. Как следствие, идет повторное освобождение памяти.

Добавлено через 2 минуты
Этот код выдаёт ту же ошибку.
Разумеется, он будет выдавать ошибку, я просто сократил ваш код, убрав оттуда использование файлов.
0
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 8
02.11.2012, 18:30  [ТС]
C++
1
std::memcpy(reinterpret_cast<char*>(&str2), reinterpret_cast<char*>(&str1), sizeof(std::string));
копируем память размера string из str1 в str2, так? получается два места с одинаковым содержимым.
если только эту строку оставить, почему ошибка? если не сложно поясните подробней, где тут повторное освобождение памяти?

Добавлено через 5 минут
Тоесть когда у меня в s3 копируются байты из файла, память по адресу s3 как то удаляется, и поэтому команда delete s3 выдаёт ошибку?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 19:54
Цитата Сообщение от guest658655 Посмотреть сообщение
я взял стринг, как пример, мне требуется считать свою структуру
Советую, в этом случае, пробовать код со своей структурой. Пример вы очень неудачно выбрали: строки, инициализированные литералами, и бинарное чтение/запись, используя адреса этих строк. Тут ошибки по разным причинам могут происходить.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.11.2012, 20:09
Цитата Сообщение от guest658655 Посмотреть сообщение
если не сложно поясните подробней, где тут повторное освобождение памяти?
Разберитесь с классами и динамическим выделением памяти.

Цитата Сообщение от alsav22 Посмотреть сообщение
Тут ошибки по разным причинам могут происходить.
Тут ошибка происходит по одной причине - после считывания/копирования строки, charT* в std::string указывает на одну область памяти.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.11.2012, 20:09
Помогаю со студенческими работами здесь

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

Чтение из бинарного файла
Создала Базу данных. запись в файл происходит, а чтение из файла не получается. исправьте, пожалуйста, или подскажите как? #include...

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

Чтение бинарного файла
Всем привет!Уже вторую ночь пытаюсь разобраться с проблемой,но пока безуспешно.Проблема такая: Микроконтроллер выдает пакеты одной...

Чтение бинарного файла
Здравствуйте. Есть код чтения бинарного файла: FILE *f; string tmp; char buff = {0}; f = fopen(&quot;data.bin&quot;,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru