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

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

Войти
Регистрация
Восстановить пароль
 
Fantom2209
29 / 29 / 13
Регистрация: 28.02.2014
Сообщений: 190
Завершенные тесты: 1
#1

Не получается открыть бинарный файл - C++

17.05.2015, 19:16. Просмотров 475. Ответов 10
Метки нет (Все метки)

Всем привет! Есть класс Garage! у него приватное поле string name и поле fstream inv;

Есть метод для записи имени в файл:
C++
1
2
3
4
5
6
7
8
9
void Garage::saveGarage()
{
    inv.open("inv", ios::out|ios::binary);
    size_t str_size = name.size();
    inv.write((char *)&str_size, sizeof(size_t));
    inv.write(name.c_str(), str_size);
    inv.write((char *)&count, sizeof(int));
    inv.close();
}
метод для считывания с файла:

C++
1
2
3
4
5
6
7
8
9
bool Garage::takeFile()
{
    size_t str_size = 0;
    inv.open("inv", ios::in | ios::binary);
    inv.read((char *)&str_size, sizeof(size_t));
    copy_n(istream_iterator<char>(inv), str_size, back_inserter(name));
    inv.close();
    return true;
}
Запись проходит гладко, а вот при попытке считать в строке inv.open("inv", ios::in | ios::binary); выкидывает исключение!

Необработанное исключение по адресу 0x0021F6E5 в courceProject.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000138.

Помогите пожалуйста исправить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2015, 19:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не получается открыть бинарный файл (C++):

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

Как открыть бинарный файл, не зная его структуру? - C++
Можно ли как-нибудь открыть бинарный файл, не зная его структуру?

Открыть бинарный файл(.ехе) и сохранить часть байтов в текст - C++
Всем привет. Задача такая: нужно прочитать .exe. в конце его есть некие спецсимволы, которые мне нужно прочитать. Например они...

не получается открыть файл - C++
всем привет. у меня такая проблема, когда я пишу в программе путь к файлу: char *file_name=&quot;C:\Users\Documents\Visual Studio...

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

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

10
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
17.05.2015, 19:29 #2
Не надо делать inv членом класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Garage::saveGarage()
{
    fstream inv("inv", ios::out|ios::binary);
    if(inv)
    {
       size_t str_size = name.size();
       inv.write((char *)&str_size, sizeof(size_t));
       inv.write(name.c_str(), str_size);
       inv.write((char *)&count, sizeof(int));
       inv.close();
    }
}
0
Fantom2209
29 / 29 / 13
Регистрация: 28.02.2014
Сообщений: 190
Завершенные тесты: 1
17.05.2015, 19:42  [ТС] #3
zss, Та же проблема( Посмотрите пожалуйста проект целиком! Возможно ошибка кроется не в этом. При запуске: нужно выбрать пункт меню - взять с фала(файл уже существует). Эти методы находятся в классе Garage в самом низу. Заранее спасибо!
0
Вложения
Тип файла: rar courceProject_2.rar (8.32 Мб, 0 просмотров)
Fantom2209
29 / 29 / 13
Регистрация: 28.02.2014
Сообщений: 190
Завершенные тесты: 1
17.05.2015, 21:37  [ТС] #4
Подымаю тему. Проблема еще актуальна! Помогите пожалуйста!
0
lss
926 / 855 / 282
Регистрация: 10.10.2012
Сообщений: 2,705
17.05.2015, 21:45 #5
Цитата Сообщение от Fantom2209 Посмотреть сообщение
inv.write((char *)&count, sizeof(int));
Это что записываешь?

Добавлено через 50 секунд
Цитата Сообщение от Fantom2209 Посмотреть сообщение
inv.open("inv", ios::in | ios::binary);
Открытие файла для чтения проверять всегда нужно.
0
Fantom2209
29 / 29 / 13
Регистрация: 28.02.2014
Сообщений: 190
Завершенные тесты: 1
17.05.2015, 21:56  [ТС] #6
Цитата Сообщение от lss Посмотреть сообщение
Это что записываешь?
извиняюсь, забыл написать, count тоже поле класса Garage.

Но это не важно! Файл записывается! Но при открытии для считывания получаем исключение. Почему такое может происходить не знаю.

Цитата Сообщение от lss Посмотреть сообщение
Открытие файла для чтения проверять всегда нужно.
Как?

Добавлено через 1 минуту
вот тестовый пример, с которого я брал код, он работает!

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
46
47
48
49
50
51
#include <iostream>
#include <fstream>
#include <windows.h>
#include <string>
 
using namespace std;
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string nameG = "Гараж1";
    int count = 4;
    int index = 1;
    int type = 1;
    string name = "Ту-300";
    int speed = 200;
    int year = 2009;
    fstream inv;
    inv.open("inv", ios::out | ios::binary);
    size_t str_size = nameG.size();
    size_t str_size1 = name.size();
    inv.write((char *)&str_size, sizeof(size_t));
    inv.write(nameG.c_str(), str_size);
    inv.write((char *)&count, sizeof(int));
    inv.write((char *)&index, sizeof(int));
    inv.write((char *)&type, sizeof(int));
    inv.write((char *)&str_size1, sizeof(size_t));
    inv.write(name.c_str(), str_size1);
    inv.write((char *)&speed, sizeof(int));
    inv.write((char *)&year, sizeof(int));
    inv.close();
    inv.open("inv", ios::in | ios::binary);
    nameG = "";
    name = "";
    count = index = type = 0;
    speed = 0;
    year = 0;
    inv.read((char *)&str_size, sizeof(size_t));
    copy_n(istream_iterator<char>(inv), str_size, back_inserter(nameG));
    inv.read((char *)&count, sizeof(int));
    inv.read((char *)&index, sizeof(int));
    inv.read((char *)&type, sizeof(int));
    inv.read((char *)&str_size1, sizeof(size_t));
    copy_n(istream_iterator<char>(inv), str_size1, back_inserter(name));
    inv.read((char *)&speed, sizeof(int));
    inv.read((char *)&year, sizeof(int));
    inv.close();
    cout << nameG << " " << count << " " << index << " " << type << " " << name << " " << speed << " " << year << " " << endl;
    system("pause");
}
0
lss
926 / 855 / 282
Регистрация: 10.10.2012
Сообщений: 2,705
17.05.2015, 22:09 #7
Цитата Сообщение от Fantom2209 Посмотреть сообщение
Как?
Вот так:
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
3
fstream inv("inv", ios::out|ios::binary);
if(inv) // проверка открытия файла
{
Добавлено через 1 минуту
Цитата Сообщение от Fantom2209 Посмотреть сообщение
вот тестовый пример, с которого я брал код, он работает!
Забудь о нём, у тебя свой код.

Добавлено через 1 минуту
Цитата Сообщение от Fantom2209 Посмотреть сообщение
Но это не важно! Файл записывается!
Это важно, от записи зависит чтение. У тебя что, один объект в файл записывается?

Добавлено через 2 минуты
Почему count не читаешь из файла?
0
Fantom2209
29 / 29 / 13
Регистрация: 28.02.2014
Сообщений: 190
Завершенные тесты: 1
17.05.2015, 23:23  [ТС] #8
Цитата Сообщение от lss Посмотреть сообщение
Почему count не читаешь из файла?
я буду читать, просто сейчас хочу разобраться с названием, и дальше буду доделывать.

смотри.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool Garage::takeFile()
{
    fstream inv;
    string name1 = "";
    if (inv)
    {
        size_t str_size = 0;
        inv.open("inv", ios::in | ios::binary);
        inv.read((char *)&str_size, sizeof(size_t));
        copy_n(istream_iterator<char>(inv), str_size, back_inserter(name1));
        inv.close();
    }
    setName(name1);
    return true;
}
 
void Garage::setName(string val)
{
    name = val;
}
без этой строки setName(name1); все работает, проверял через точки останова, в name1 считывается то что нужно. Но когда я пытаюсь полю класса (name) присвоить name1 выкидывает:

Необработанное исключение по адресу 0x0133BD4B в courceProject.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000018.

насколько я понял, он не может защищенному полю присвоить.
0
lss
926 / 855 / 282
Регистрация: 10.10.2012
Сообщений: 2,705
17.05.2015, 23:51 #9
Цитата Сообщение от Fantom2209 Посмотреть сообщение
насколько я понял, он не может защищенному полю присвоить.
Нет, это же метод класса.

Добавлено через 2 минуты
Но вот это - не проверка открытия файла для чтения:
Цитата Сообщение от Fantom2209 Посмотреть сообщение
if (inv)
{
size_t str_size = 0;
inv.open("inv", ios::in | ios::binary);
inv.read((char *)&str_size, sizeof(size_t));
copy_n(istream_iterator<char>(inv), str_size, back_inserter(name1));
inv.close();
}
Это должно быть после:
C++
1
 inv.open("inv", ios::in | ios::binary);
Добавлено через 3 минуты
Или так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool Garage::takeFile()
{
    fstream inv("inv", ios::in | ios::binary);
    
    if (inv)
    {
        string name1 = "";
        size_t str_size = 0;
        inv.read((char *)&str_size, sizeof(size_t));
        copy_n(istream_iterator<char>(inv), str_size, back_inserter(name1));
        inv.close();
    
        setName(name1);
        return true;
   }
   return false;
 
}
0
Fantom2209
29 / 29 / 13
Регистрация: 28.02.2014
Сообщений: 190
Завершенные тесты: 1
18.05.2015, 00:01  [ТС] #10
lss, Не помогло! Посмотри пожалуйста проект, может я накосячил где то в другом месте.
0
Fantom2209
29 / 29 / 13
Регистрация: 28.02.2014
Сообщений: 190
Завершенные тесты: 1
18.05.2015, 00:01  [ТС] #11
Вот проект
0
Вложения
Тип файла: rar courceProject_2.rar (8.29 Мб, 1 просмотров)
18.05.2015, 00:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2015, 00:01
Привет! Вот еще темы с ответами:

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

Бинарный файл - C++
Всем добрый день. Почему программа не записывает в бинарном формате? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; ...

Бинарный файл - C++
Удалить из бинарного файла, в котором записаны целые числа все четные элементы.

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


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

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

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