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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
guest658655
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 8
#1

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

01.11.2012, 16:14. Просмотров 1442. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2012, 16:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение из бинарного файла - неведомое исключение (C++):

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

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

Чтение из бинарного файла - C++
Уважаемые форумчане! Прошу помочь мне с чтением из бинарного файла. Проблема следующая. Есть функция, которая пишет в бинарный файл -...

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

Чтение бинарного файла - C++
Добрый Добавлено через 6 минут Добрый день. Не получается прочитать бин. файл. Суть какая: есть файл, в котором записаны дубл...

Чтение из бинарного файла - C++
Добрый вечер.Возникла проблема при чтении имени объекта из бинарного файла,запись в файл идет по структуре |char|int|double|float|'/0'|...

38
guest658655
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 8
02.11.2012, 16:52  [ТС] #16
Цитата Сообщение от soon Посмотреть сообщение
Суть ясна?
Меняются местами блоки памяти, это вы имели ввиду?

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

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

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

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

Цитата Сообщение от alsav22 Посмотреть сообщение
Тут ошибки по разным причинам могут происходить.
Тут ошибка происходит по одной причине - после считывания/копирования строки, charT* в std::string указывает на одну область памяти.
1
guest658655
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 8
02.11.2012, 20:18  [ТС] #21
Цитата Сообщение от alsav22 Посмотреть сообщение
Советую, в этом случае, пробовать код со своей структурой. Пример вы очень неудачно выбрали: строки, инициализированные литералами, и бинарное чтение/запись, используя адреса этих строк. Тут ошибки по разным причинам могут происходить.
я пытаюсь записать и считать класс, в котором есть значения string

Цитата Сообщение от soon Посмотреть сообщение
Тут ошибка происходит по одной причине - после считывания/копирования строки, charT* в std::string указывает на одну область памяти.
вроде доходит, спасибо пойду разбираться.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 20:24 #22
Цитата Сообщение от soon Посмотреть сообщение
Тут
Тут, имеется ввиду, где? В каком коде? Из первого поста?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.11.2012, 20:26 #23
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут, имеется ввиду, где? В каком коде? Из первого поста?
В постах ##1, 5, 6.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 20:32 #24
Цитата Сообщение от guest658655 Посмотреть сообщение
я пытаюсь записать и считать класс, в котором есть значения string
Зачем строки таким именно способом читать/записывать? Обычно, если читается/записывается класс, то не делают чтение/запись всей памяти под объектом (потому что неизвестно,что читается/записывается в результате), а делается в классе перегрузка операторов чтения/записи и в них уже прописывается, как именно читать/записывать поля класса.

Цитата Сообщение от soon Посмотреть сообщение
В постах ##1, 5, 6.
Тут ошибка происходит по одной причине - после считывания/копирования строки, charT* в std::string указывает на одну область памяти.
И что дальше, если взять код из первого поста?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.11.2012, 20:36 #25
Цитата Сообщение от alsav22 Посмотреть сообщение
а делается в классе перегрузка операторов чтения/записи и в них уже прописывается, как именно читать/записывать поля класса.
Как же тогда в Си без перегрузок обходятся...

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
И что дальше, если взять код из первого поста?
Каг-бе именно это весь тред мусолят, не?
0
guest658655
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 8
02.11.2012, 20:45  [ТС] #26
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем строки таким именно способом читать/записывать? Обычно, если читается/записывается класс, то не делают чтение/запись всей памяти под объектом (потому что неизвестно,что читается/записывается в результате), а делается в классе перегрузка операторов чтения/записи и в них уже прописывается, как именно читать/записывать поля класса.
мне надо записать примерно такой класс:

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
#include <iostream>
#include <string>
#include <fstream>
 
using namespace std;
 
class myclass
{
public:
    std::string str;
    int i;
    bool yes;
 
    myclass() { str = "empty"; i = 0; yes = true; }
};
 
int main()
{
    myclass A, B;
 
    A.str = "abc";
    A.i = 5;
    A.yes = false;
 
    std::ofstream save( "data.bin", std::ios::out | std::ios::binary );
 
    if( save ) 
    {
        save.write( reinterpret_cast <char *> ( &A ), sizeof( myclass ) );
        save.close();
    }
 
    std::ifstream load( "data.bin", std::ios::binary );
 
    if( load )
    {
        load.read( reinterpret_cast <char *> ( &B ), sizeof( myclass ) );
        load.close();
    }
 
    cout << B.str << "\n" << B.i << "\n" << B.yes << "\n";
 
    system("pause");
    return 0;
}
хотя бы кратко скажите что делать? до system("pause") доходит без проблем, но уже по завершении вылетает исключение :/
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 21:04 #27
Ничего конкретного по коду из первому поста я не услышал. И где там что указывает на одну область памяти?

Добавлено через 16 минут
Мне кажется, в первом посте ошибка происходит из-за того, что чтение (всего объекта из файла) происходит в память, занятую объектом string, т.е. не в строку на которую указывает этот объект, а в сам объект, что вызывает ошибку нерушения прав при записи.
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.11.2012, 21:07 #28
guest658655, Можете выделять память под массив char, затем его копировать в переменную std::string. Можете считывать побайтово и использовать push_pack. Вариантов масса.

alsav22, т.е. вас не смущет, что сначала объект s1 побайтово пишется в data.bin, а потом эти-же данные пишутся в объект s2?

Добавлено через 3 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Мне кажется, в первом посте ошибка происходит из-за того, что чтение происходит в память, занятую объектом string, т.е. не в строку на которую указывает этот объект,
Он никуда не указывает
Цитата Сообщение от alsav22 Посмотреть сообщение
а в сам объект, что вызывает ошибку нерушения прав при записи.
Неа. Под объект std::string выделено sizeof(std::string) байт памяти. Вы можете делать с ними все что вам захочется. В первом посте наглядно показано, к чему это может привести.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 21:11 #29
Цитата Сообщение от soon Посмотреть сообщение
Он никуда не указывает
Разве в объекте string не содержится указатель на строку, с которой он связан?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.11.2012, 21:17 #30
alsav22, в объекте - содержится, да. Но сам объект никуда не указывает.
0
02.11.2012, 21:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2012, 21:17
Привет! Вот еще темы с ответами:

Чтение из бинарного файла - C++
Всем приветы. Подскажите или помогите, пожалста. Есть вот такая штука: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Чтение из бинарного файла - C++
Здравствуйте. У меня имеется некий класс Product, объекты которого хранятся в объекте класса Vector. Есть функция записи вектора в бинарный...

Чтение бинарного файла - C++
как получить доступ к произвольному адресу файла? Нужно отправить файл через ком порт но не с 0 а с адреса 1а000 в цикле по 0х100 байт. с 0...

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


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

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

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