0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 4
1

Запись и чтение из бинарного файла, объяснить поведение программы

13.05.2015, 20:59. Показов 1265. Ответов 10
Метки нет (Все метки)

Добрый день!

Подскажите, есть код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <fstream>
#include <iostream>
 
using namespace std;
 
int main()
{
    int i=1234567, j=0;
 
    fstream f("test",ios::in|ios::out|ios::binary);
 
 
    f.write(reinterpret_cast<char*>(&i),sizeof(int));
    f.seekg(-sizeof(int),ios::cur);
    f.read(reinterpret_cast<char*>(&j),sizeof(int));
    cout<<j<<endl; 
 
    f.close();
    return 0;
}
выводит результат 0 вместо ожидаемого 1234567 (в файл test при этом значение есть hex:87 D6 12 00)
если при этом просто открывать файл для чтения

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <fstream>
#include <iostream>
 
using namespace std;
 
int main()
{
 
    int j=0;
 
    fstream f("test",ios::in|ios::binary);
 
 
    f.read(reinterpret_cast<char*>(&j),sizeof(int));
    cout<<j<<endl; 
 
    f.close();
 
    return 0;
}
то результат как и ожидалось: 1234567.
Подозреваю, что-то не так с seekg().
Спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2015, 20:59
Ответы с готовыми решениями:

Запись/чтение бинарного файла
У меня есть процедура которая на вход принимает строку , имя файла , и записывает новый элемент в...

Запись и чтение бинарного файла
Доброго времени суток! Уже какой час бьюсь над проблемой и не могу никак решить ее :( ...

Запись и чтение бинарного файла
в общем, имею форму, задача которой при нажатии кнопки записать из TextBox1, 2, 3... в бинарный...

Чтение и запись бинарного файла
Помогите объяснить и переделать не большую программу с VB6 , на C#. А то перечитал много книг , но...

10
43 / 40 / 48
Регистрация: 13.05.2015
Сообщений: 222
13.05.2015, 21:25 2
Вам нужен код программы реализующий алгоритм записи и чтения бинарных файлов?
0
Pure Free Digital Ghost
4570 / 1886 / 365
Регистрация: 06.01.2013
Сообщений: 4,529
13.05.2015, 21:33 3
Zerge, если файла не было, он не создаётся. В итоге ничего не работает, ибо невалидно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <fstream>
#include <iostream>
 
using namespace std;
 
int main()
{
    int i=1234567, j=0;
 
    fstream f("test",ios::in|ios::out|ios::binary|ios::trunc); // Так - работает
 
 
    f.write(reinterpret_cast<char*>(&i),sizeof(int));
    f.seekg(-sizeof(int),ios::cur);
    f.read(reinterpret_cast<char*>(&j),sizeof(int));
    cout<<j<<endl; 
 
    f.close();
    return 0;
}
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
13.05.2015, 21:41 4
Цитата Сообщение от Zerge Посмотреть сообщение
f.seekg(-sizeof(int),ios::cur);
Не нужно, в параметрах seekg(), использовать sizeof() с минусом. Или отдельно вычисли, или замени на -4.
И flush() сделай после записи.

Добавлено через 58 секунд
...
Цитата Сообщение от FraidZZ Посмотреть сообщение
если файла не было,
Цитата Сообщение от Zerge Посмотреть сообщение
в файл test при этом значение есть hex:87 D6 12 00
0
Pure Free Digital Ghost
4570 / 1886 / 365
Регистрация: 06.01.2013
Сообщений: 4,529
13.05.2015, 21:51 5
Лучший ответ Сообщение было отмечено Zerge как решение

Решение

lss, у меня всё вышло ровно наоборот: файл не создавался, но когда был уже создан - всё работало как по маслу.

Цитата Сообщение от lss Посмотреть сообщение
flush() сделай после записи
Это и поможет.

Цитата Сообщение от lss Посмотреть сообщение
Не нужно, в параметрах seekg(), использовать sizeof() с минусом
Ну почему же.
C++
1
f.seekg(- (int) sizeof(int), ios::cur);
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
13.05.2015, 21:56 6
Цитата Сообщение от FraidZZ Посмотреть сообщение
Это и поможет.
Тут как раз не обязательно, если перед чтением seekg() есть.

Добавлено через 2 минуты
Цитата Сообщение от FraidZZ Посмотреть сообщение
Ну почему же.
C++
1
f.seekg(- (int) sizeof(int),ios::cur);
Вот так не нужно:
Цитата Сообщение от Zerge Посмотреть сообщение
C++
1
f.seekg(-sizeof(int),ios::cur);
А лучше, если требуется минусовое смещение, во избежание сюрпризов:
Цитата Сообщение от lss Посмотреть сообщение
отдельно вычисли
Добавлено через 50 секунд
Цитата Сообщение от FraidZZ Посмотреть сообщение
но когда был уже создан - всё работало как по маслу.
Компилятор какой?
0
Pure Free Digital Ghost
4570 / 1886 / 365
Регистрация: 06.01.2013
Сообщений: 4,529
13.05.2015, 21:57 7
lss, в итоге получается гадание на кофейной гуще
Давайте ТС будет использовать всё - что-то да поможет

Хотя, имхо, в случае с seekg всё же перемещение должно сработать - каст-то даже -sizeof(int) так или иначе делается к int, что в итоге родит валидное -4.

Добавлено через 42 секунды
Цитата Сообщение от lss Посмотреть сообщение
Компилятор какой?
gcc 4.9.2, режим std=c++11 или std=c++14 не включен.
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
13.05.2015, 22:07 8
Цитата Сообщение от FraidZZ Посмотреть сообщение
gcc 4.9.2,
В студии, вот такое не работает, и это факт:
C++
1
f.seekg(-sizeof(int),ios::cur);
Добавлено через 3 минуты
...
warning C4146: применение унарного минуса к типу без знака; результат оставлен без знака
0
Pure Free Digital Ghost
4570 / 1886 / 365
Регистрация: 06.01.2013
Сообщений: 4,529
13.05.2015, 22:25 9
lss, ясно. GCC поступает, имхо, правильнее, по сути, давая валидное знаковое число, хоть и формально имеющее беззнаковый тип.

С другой стороны, про это можно долго спорить.
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
13.05.2015, 22:27 10
Цитата Сообщение от FraidZZ Посмотреть сообщение
С другой стороны, про это можно долго спорить.
Да, поэтому:
Цитата Сообщение от lss Посмотреть сообщение
А лучше, если требуется минусовое смещение, во избежание сюрпризов:
Сообщение от lss
отдельно вычисли
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 4
14.05.2015, 09:36  [ТС] 11
Спасибо за помощь.

Помогло
C++
1
f.seekg(- (int) sizeof(int), ios::cur);
Оказывается нужно явное преобразование.
Вопрос снят.

Про флаг ios::trunc где-то вчера вычитал что при ios::out он подразумевается, а при комбинации ios::in|ios::out уже нет, и его надо ставить явно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2015, 09:36
Помогаю со студенческими работами здесь

Запись и чтение из бинарного файла
Есть программа написанная на языке C++, нужно ее изменить так, чтобы сериализация и десериализация...

Запись/чтение бинарного файла
Здавствуйте, помогите, пожалуйста, с чтением и записью объекта в бинарный файл. Пишут, что...

Чтение/запись бинарного файла
Надо проверить корректно ли работает стек. #include &quot;stack.h&quot; #include &lt;fstream&gt; #include...

Чтение и запись бинарного файла
Добрый день! Есть задача прочитать с бинарного файла информацию, обработать ее и записать результат...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru