Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2017, 08:41   #1
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
По умолчанию Проблемы при бинарном чтении/записи fstream

Имею две программы, одна - пишет в определенном порядке char'овые и int'овые значения в файл. При этом, число в чаре определяет, сколько будет int'овых значений перед следующим char'ом.
По началу всё было хорошо, но когда появились числа больше 10 или два int подряд, начались большие проблемы, связанные с тем, что никак не удаётся верно прочитать данные.

Пробовал делать чтение и запись двумя способами, всё равно ничего не выходит.

Dump файла в HEX:
Код:
0000000 09 30 33 09 30 34 30 04 30 00 00               
000000b
Способ №1
Код записи:

Код:
ofstream fout("filename", fstream::binary);
// для первых двух строк результата, выполняется два раза
char cmd;
	int secOp;
	
	fout << cmd;
    fout << resolveId(funcArgv[0]);
    fout << secOp;
Код чтения:
Код:
ifstream fin("filename", fstream::binary);
char c;
    while(fin.get(c))
    {
        int a = 0;
        cout << (int)c << "\t";
        if (c == COMMAND_SET_XV)
        {
            fin >> a;
            cout << a << "\t";
        }
        fin >> a;
        cout << a << endl;
    }
Выводит:

9 3 40
4 0
0 0

Должно выводить:

9 0 3
9 0 40
4 0

Способ №2
Dump файла:
Код:
0000000 09 00 00 00 00 03 00 00 00 09 00 00 00 00 28 00
0000010 00 00 04 30 00 00                              
0000016
Код записи:
Код:
int d, secOp;
fout << cmd;
fout.write((char*)&d, sizeof(int));
fout.write((char*)&secOp, sizeof(int));
Код чтения:
Код:
    char c;
    while (fin.get(c)) {
        int a = 0;
        int *df = new int;
        cout << (int)c << "\t";
        if (c == COMMAND_SET_XV) {
            fin.get((char*)df, sizeof(int));
            cout << *df << "\t";
        }
        fin.get((char*)&a, sizeof(int));
        cout << a << endl;
    }
Вывод (а дальше failbit и чтение завершается):
Код:
9	0	0
Пытался работать с флагами, становилось только хуже. Пробовал менять width, тоже не помогло (ставил 4).

Очень срочно прошу Вашей помощи!
Прошу прощения за допущенные ошибки в оформлении темы, если таковые имеются, сидел всю ночь в поисках решения, сдача сегодня.
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Старый 31.03.2017, 09:20   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Выложи весь проект - я его пощупаю.

Скажи, а зачем тебе hex?

Последний раз редактировалось Alex11223; 31.03.2017 в 09:32.
ura_111 вне форума Ответить с цитированием
Старый 31.03.2017, 09:26   #3
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
Сообщение

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Выложи весь проект - я его пощупаю.
Проект выложить не могу.

Полный исходный код читающей части (вырвал код и вставил в main).

Код:
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char** argv)
{
	ifstream fin(argv[1]);
	char c;
	while(fin.get(c))
	{
		int a = 0;
		cout << (int)c << "\t";
		if (c == (char)9)
		{
			fin >> a;
			cout << a << "\t";
		}
		fin >> a;
		cout << a << endl;
	}
	return 0;
}
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Старый 31.03.2017, 09:28   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

А данные (для записи) откуда ты берёшь?
ura_111 вне форума Ответить с цитированием
Старый 31.03.2017, 09:28   #5
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Скажи, а зачем тебе hex?
Такая вот задача. Вообще, это не шестнадцатиричная, ибо fstream по умолчанию работает в десятичном формате, чтение/запись, но содержимое вывожу через hexdump, ибо больше нечем.
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Старый 31.03.2017, 09:29   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

У меня файла нет из которого читать надо.
ura_111 вне форума Ответить с цитированием
Старый 31.03.2017, 09:29   #7
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
А данные (для записи) откуда ты берёшь?
Там были замудрёные алгоритмы, которые я выводил не только в файл (в указанном формате), но и в нормальном виде на консоль. Данные верные идут. Те, что я указал в описании темы, выходят на экран перед записью в файл.
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Старый 31.03.2017, 09:31   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Скажи, а зачем тебе hex?
автор не выводит hex строки, он просто смотрит содержимое бинарного файла. Обычно для этого используют hex-редакторы, которые по умолчанию так выводят (часто это удобнее).
https://ru.wikipedia.org/wiki/Hex-%D...82%D0%BE%D1%80
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 31.03.2017, 09:33   #9
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Для начала мне надо подготовить файл, чтобы потом пытайться его читать.

Расскажи о данных
9 0 3
9 0 40
4 0
ura_111 вне форума Ответить с цитированием
Старый 31.03.2017, 09:34   #10
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
У меня файла нет из которого читать надо.
Приложил к сообщению файлы.
prog.you - файл, откуда читать.
selftest.cpp - генератор файла с данными из того алгоритма в том же виде, что и происходит вывод.
Вложения
Тип файла: zip prog.you.zip (171 байт, 8 просмотров)
Тип файла: zip selftest.cpp.zip (309 байт, 8 просмотров)
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переполнение стека при рекурсии (в бинарном дереве) LordJohn Помощь студентам 0 11.11.2012 18:28
блокировка файлов при чтении и записи Arassir PHP 1 06.07.2011 00:00
Проблемы при записи и считыванияиз базы данных Aleksandr Общие вопросы Delphi 5 14.06.2011 23:52
Копировать данные при чтении Doctordradd Общие вопросы Delphi 0 02.11.2010 18:43
проблемы с потоковой записью в структуру и при чтении BloodMaX Общие вопросы C/C++ 0 21.04.2010 19:15