30 / 30 / 20
Регистрация: 28.02.2014
Сообщений: 195
1

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

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

Author24 — интернет-сервис помощи студентам
Всем привет! Есть класс 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
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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


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

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

Новые блоги и статьи
Интеграция Arduino и ChatGPT: Практическое руководство
InfoMaster 16.01.2025
В современную эпоху технологических инноваций интеграция искусственного интеллекта с микроконтроллерами открывает принципиально новые возможности для создания умных устройств и автоматизированных. . .
Как создать робота, управляемого ChatGPT
InfoMaster 16.01.2025
Концепция проекта В современную эпоху искусственный интеллект и робототехника становятся все более доступными для энтузиастов и разработчиков. Создание роботизированной руки, управляемой ChatGPT,. . .
Как создать ChatGPT бота в Telegram на Python
InfoMaster 16.01.2025
В современном мире технологии искусственного интеллекта становятся все более доступными для разработчиков, открывая новые возможности для создания умных и интерактивных приложений. Одним из самых. . .
Машинное обучение с помощью Python
InfoMaster 16.01.2025
Машинное обучение стало неотъемлемой частью современных технологий, позволяя компьютерам учиться на основе данных и принимать решения без явного программирования. В сочетании с языком. . .
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru