Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Fantom2209
29 / 29 / 20
Регистрация: 28.02.2014
Сообщений: 192
Завершенные тесты: 1
#1

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

17.05.2015, 19:16. Просмотров 500. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

не получается открыть файл
всем привет. у меня такая проблема, когда я пишу в программе путь к файлу:...

10
zss
Модератор
Эксперт С++
7097 / 6628 / 4196
Регистрация: 18.12.2011
Сообщений: 17,474
Завершенные тесты: 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 / 20
Регистрация: 28.02.2014
Сообщений: 192
Завершенные тесты: 1
17.05.2015, 19:42  [ТС] #3
zss, Та же проблема( Посмотрите пожалуйста проект целиком! Возможно ошибка кроется не в этом. При запуске: нужно выбрать пункт меню - взять с фала(файл уже существует). Эти методы находятся в классе Garage в самом низу. Заранее спасибо!
0
Вложения
Тип файла: rar courceProject_2.rar (8.32 Мб, 0 просмотров)
Fantom2209
29 / 29 / 20
Регистрация: 28.02.2014
Сообщений: 192
Завершенные тесты: 1
17.05.2015, 21:37  [ТС] #4
Подымаю тему. Проблема еще актуальна! Помогите пожалуйста!
0
lss
930 / 859 / 355
Регистрация: 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 / 20
Регистрация: 28.02.2014
Сообщений: 192
Завершенные тесты: 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
930 / 859 / 355
Регистрация: 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 / 20
Регистрация: 28.02.2014
Сообщений: 192
Завершенные тесты: 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
930 / 859 / 355
Регистрация: 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 / 20
Регистрация: 28.02.2014
Сообщений: 192
Завершенные тесты: 1
18.05.2015, 00:01  [ТС] #10
lss, Не помогло! Посмотри пожалуйста проект, может я накосячил где то в другом месте.
0
Fantom2209
29 / 29 / 20
Регистрация: 28.02.2014
Сообщений: 192
Завершенные тесты: 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

Не получается открыть файл с именем, которое задается пользователем в консоли
Хочу написать процедуру для работы с файлами. В нее нужно передавать имя файла,...

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

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


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

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

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