Задать вопрос
alexey_sigida
@alexey_sigida

Почему получается странная кодировка в файле?

В общем такая проблема: дан двоичный файл, я из него извлекаю слово и его номер. Если сразу выводить в текстовый файл, то все выглядит адекватно. Но мне надо воспользоваться исходным классом sortedCollection. Если используется метод insert в данном классе и делается вывод всего в текстовый файл, то меняется кодировка и выдаются не те символы. Номера остаются правильными, а слова меняются. Мне кажется, что проблема в кодировке. Подскажите, как поменять? Или в чем еще может быть проблема? Слова - набор символов. Вот пример одной из строк без использования класса:
+NOBL1 65479
С использованием класса:
P3Ѓ+X. 65479

Строку взял одну и ту же.
Без использования, повторюсь, выводит правильно.
Я использую собственную структуру с двумя полями. Char* и unsigned short. Полученный объект уже записываю в объект класса sortedCollection.

using namespace std;

struct cm
	{
		char* a;
		unsigned short b;
	};

class MyCollection :
	public sortedCollection
{
public:
MyCollection(cc_Index limit, cc_Index delta) : sortedCollection(limit, delta) {


			duplicates = True;

		}
		virtual void *keyOf( void *item )
		{
			return &(((cm*)item)->b);
		}

		virtual int compare (void *k1, void *k2 )
			{
				return *((unsigned short*)k1) - *((unsigned short*)k2);
				
			} 

			
		
void print(ofstream& f1){
			f1<<"Q="<<count<<endl;
			cm* dat;
			for( int i = 0; i < count; i++ ){
				dat = (cm *)at(i);
				f1   << dat->a << " " << dat->b << endl;
			}
			f1.close();
		}

};


void main()
{
	char buf[8]; 
	unsigned short count;
	ofstream f1("cm.txt");
	ifstream file("CM.dat",ios::binary);
	if (!file)
	{
		cout<<"error"<<endl;
	}
	else
	{
		cout<<"OK"<<endl;
	}
	MyCollection msc(4,2);
	file.read(buf,2);
	count = (buf[0]<<8) | (buf[1]);
	cout<<count<<endl;
	_getch();	
	for (int i = 0; i < count ; i++)
	{
		cm* dat = new cm();
		file.read(buf,8);
		for (int j = 0; j < 8; j++)
		{
			if (buf[j] == ' ')
			buf[j] = 0;
			
		}
		dat->a = new char[9];
		strcpy(dat->a,buf);
		file.read(buf,2);
		unsigned short a;
		a = (buf[0]<<8) | (buf[1]);
		dat->b = a;
		file.read(buf,2);	
		msc.insert(dat);
	}
	

	file.close();
	msc.print(f1);
	
	 _getch();

}
  • Вопрос задан
  • 164 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
msc.insert(dat);
Перед этой строчкой dat правильный, проверь?

Если правильный — возможно, виновата ваша коллекция.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы