Аватар для Fantom2209
30 / 30 / 20
Регистрация: 28.02.2014
Сообщений: 195

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

17.05.2015, 19:16. Показов 2063. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2015, 19:16
Ответы с готовыми решениями:

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

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

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

10
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
17.05.2015, 19:29
Не надо делать 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
30 / 30 / 20
Регистрация: 28.02.2014
Сообщений: 195
17.05.2015, 19:42  [ТС]
zss, Та же проблема( Посмотрите пожалуйста проект целиком! Возможно ошибка кроется не в этом. При запуске: нужно выбрать пункт меню - взять с фала(файл уже существует). Эти методы находятся в классе Garage в самом низу. Заранее спасибо!
Вложения
Тип файла: rar courceProject_2.rar (8.32 Мб, 1 просмотров)
0
 Аватар для Fantom2209
30 / 30 / 20
Регистрация: 28.02.2014
Сообщений: 195
17.05.2015, 21:37  [ТС]
Подымаю тему. Проблема еще актуальна! Помогите пожалуйста!
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.05.2015, 21:45
Цитата Сообщение от Fantom2209 Посмотреть сообщение
inv.write((char *)&count, sizeof(int));
Это что записываешь?

Добавлено через 50 секунд
Цитата Сообщение от Fantom2209 Посмотреть сообщение
inv.open("inv", ios::in | ios::binary);
Открытие файла для чтения проверять всегда нужно.
0
 Аватар для Fantom2209
30 / 30 / 20
Регистрация: 28.02.2014
Сообщений: 195
17.05.2015, 21:56  [ТС]
Цитата Сообщение от 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
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.05.2015, 22:09
Цитата Сообщение от Fantom2209 Посмотреть сообщение
Как?
Вот так:
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
3
fstream inv("inv", ios::out|ios::binary);
if(inv) // проверка открытия файла
{
Добавлено через 1 минуту
Цитата Сообщение от Fantom2209 Посмотреть сообщение
вот тестовый пример, с которого я брал код, он работает!
Забудь о нём, у тебя свой код.

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

Добавлено через 2 минуты
Почему count не читаешь из файла?
0
 Аватар для Fantom2209
30 / 30 / 20
Регистрация: 28.02.2014
Сообщений: 195
17.05.2015, 23:23  [ТС]
Цитата Сообщение от 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
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
17.05.2015, 23:51
Цитата Сообщение от 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
30 / 30 / 20
Регистрация: 28.02.2014
Сообщений: 195
18.05.2015, 00:01  [ТС]
lss, Не помогло! Посмотри пожалуйста проект, может я накосячил где то в другом месте.
0
 Аватар для Fantom2209
30 / 30 / 20
Регистрация: 28.02.2014
Сообщений: 195
18.05.2015, 00:01  [ТС]
Вот проект
Вложения
Тип файла: rar courceProject_2.rar (8.29 Мб, 2 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2015, 00:01
Помогаю со студенческими работами здесь

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

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

Открыть бинарный файл и считывать в потоке средствами CLR
Нужно открыть бинарник в потоке и считывать с него байты, с возможностью указать смещение и кол-во считываемых байтов. Через StreamReader...

Как открыть в потоке бинарный файл, добавленный в проект?
Допустим, в проекте есть папка Source, а в ней бинарный файл Temp.hz. При таком коде: Assembly assembly =...

Не получается открыть файл
На экран выводится, что не удалось открыть файл, а при компиляции, что переменная &quot;с&quot; не используется в фунции. Файл находится...


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

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

Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru