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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2012, 17:35   #1
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию Запись и чтение бинарного файла

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

Код:
struct ListChannel
	{
	public:
		ListChannel()
		{
			iNumberOfPaket=0;
			wcscpy( canal1,L"");
			wcscpy( canal2,L"");
			wcscpy(canal3,L"");
			wcscpy( canal4,L"");
			wcscpy(canal5,L"");

		}
		int iNumberOfPaket;
		TCHAR canal1[100];
		TCHAR canal2[100];
		TCHAR canal3[100];
		TCHAR canal4[100];
		TCHAR canal5[100];
		
	};
Я так понимаю, что неправильно произвожу приведение указателей при записи и чтении
чтение
Код:
ListChannel data;
wfstream ClientFile ( "ListOfChannel.dat", ios::binary|ios::in|ios::out);
ClientFile.seekg( ( run - 1 )*sizeof( ListChannel ) );
ClientFile.read(reinterpret_cast<wchar_t *>( &data ),
sizeof( ListChannel ) );
запись
Код:
ofstream FileChannel ( "ListOfChannel.dat", ios::binary );
FileChannel.seekp( ( run - 1 ) *sizeof( ListChannel ) );
FileChannel.write(reinterpret_cast<const char *>( &data ),
sizeof( ListChannel ) );
Если я правильно понимаю, при записи в виде Юникод приведение должно быть
Код:
reinterpret_cast<wchar_t *>
а при чтении
Код:
reinterpret_cast<char *>
То есть записываем по 2 байта, а считывать можем по одному байту.
Заранее спасибо!
Желание тысяча возможностей, нежелание - тысяча причин

Последний раз редактировалось Стремящийся; 26.05.2012 в 17:38.
Стремящийся вне форума Ответить с цитированием
Старый 26.05.2012, 19:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Два нескромных вопроса:
1) Я верно понимаю - в структуре присутствуют методы? Может отделить котлеты от мух?
2) Ты записываешь юникод? А считываешь как Акси?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2012, 19:43   #3
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию

Привет Виталик!
В структуре нет методов, только конструктор(пришлось его создать, потому-что при создании объекта структуры в полях был мусор).

Код:
2) Ты записываешь юникод? А считываешь как Акси?
Ты прав, я уже исправил. Я везде поставил "w" перед потоками и в приведениях
Код:
reinterpret_cast<char *>( &data )
везде указал
Код:
wchar_t *>
,а получил что теперь файл не наполняется (всего 3байта), при
Код:
reinterpret_cast<char *>( &data )
и ofstream, файл наполнялся до 30кб. Ерунда какая-то, поля структуры ведь в Юникоде.
Желание тысяча возможностей, нежелание - тысяча причин
Стремящийся вне форума Ответить с цитированием
Старый 27.05.2012, 16:58   #4
alezha
Форумчанин
 
Регистрация: 16.04.2011
Сообщений: 126
По умолчанию

Никогда не слышал, что в структуре нужен конструктор.
alezha вне форума Ответить с цитированием
Старый 27.05.2012, 17:33   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Всетки не понимаю зачем такое усложнение.
Давай так, я выкладываю свою философию, а ты уже анализируешь - подходит бери, нет - так нет:
Код:
// ff.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <fstream>
#include<Windows.h>
#include <string>

using namespace std;

struct ListChannel
	{
		int iNumberOfPaket;
		TCHAR canal1[100];
		TCHAR canal2[100];
		TCHAR canal3[100];
		TCHAR canal4[100];
		TCHAR canal5[100];
		
	};

ListChannel data;

void qu(TCHAR *t,string s){int i; for(i=0;i<s.length();i++) t[i]=s[i]; }

int _tmain(int argc, _TCHAR* argv[])
{

	ZeroMemory(&data,sizeof(data));
	data.iNumberOfPaket=13;
	qu(data.canal1,"hello");

wfstream FileChannel ( "ListOfChannel.dat", ios::binary|ios::out );
FileChannel.seekp( 0 );
FileChannel.write(reinterpret_cast<wchar_t *>( &data ),
sizeof( ListChannel ) );
FileChannel.close();

wfstream ClientFile ( "ListOfChannel.dat", ios::binary|ios::in);
ClientFile.seekg( 0 );
ClientFile.read(reinterpret_cast<wchar_t *>( &data ),
sizeof( ListChannel ) );
ClientFile.close();
	return 0;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение и запись бинарного файла sidestep Общие вопросы C/C++ 1 07.04.2012 21:12
чтение бинарного файла Snake22 Общие вопросы Delphi 1 23.01.2012 07:44
чтение из бинарного файла Kukurudza Общие вопросы C/C++ 6 08.09.2011 19:09
запись/чтение из бинарного файла. H1ghlander Общие вопросы C/C++ 0 21.11.2010 17:44
Запись/чтение из бинарного файла - непонятные проблемы.... Jorgen Общие вопросы C/C++ 1 26.11.2009 11:45