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

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

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

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

01.11.2012, 16:14. Просмотров 1452. Ответов 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
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
01.11.2012, 17:27 #2
у меня отлично работает этот код, компилил в билдере
0
guest658655
0 / 0 / 0
Регистрация: 01.11.2012
Сообщений: 8
01.11.2012, 17:34  [ТС] #3
в visual studio 2010 вылетает с исключением :/
0
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
01.11.2012, 18:06 #4
http://www.microsoft.com/en-us/download/details.aspx?id=5555

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

Добавлено через 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
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.11.2012, 22:20 #6
Цитата Сообщение от 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
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 22:28 #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
#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
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.11.2012, 22:37 #8
Цитата Сообщение от alsav22 Посмотреть сообщение
load.read((char*)s2.c_str(), s2.size() );
За это, кстати, тоже руки отрывать не мешало бы.
1
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 23:05 #9
За это, за что?
1
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.11.2012, 23:15 #10
alsav22, как минимум за снятие константности.
0
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 23:18 #11
Цитата Сообщение от soon Посмотреть сообщение
alsav22, как минимум за снятие константности.
А как максимум? И чем, в данном случае, грозит снятие константности?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.11.2012, 23:24 #12
Цитата Сообщение от alsav22 Посмотреть сообщение
И чем, в данном случае, грозит снятие константности?
Запись в область памяти, расположенной по указателю c_str - UB.
1
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 23:28 #13
Если так:
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
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.11.2012, 23:36 #14
Поторопились. Считывать надо 1 байт, а не s2.size(). Запись в файл можно было не менять, write принимает const char*.
0
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2012, 23:42 #15
Исправляю:
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
01.11.2012, 23:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2012, 23:42
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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