LINUX.ORG.RU

[C++,STL] Чтение двоичных данных из fstream через итераторы


0

2

Как можно/нужно читать из файлового потока двоичные данные (например, double), используя итераторы? При попытке специализировать istreambuf_iterator тем-же double компилятор ругается на невозможность специализировать им char_traits. Как поступить в данном случае? Изобретать более другой итератор, или специализировать char_traits для double?

>Изобретать более другой итератор, или специализировать char_traits для double?

Это на китайском языке написано с правилами суахильской пунктуации?

anonymous
()
Ответ на: комментарий от anonymous

> Это на китайском языке написано с правилами суахильской пунктуации?

Что-то вроде этого.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от Reset

> Как C++ помогает решать проблемы, которых без него не существовало

Критикуй - убивай!

ACR
()
Ответ на: комментарий от Reset

> читать надо не через итераторы

Просто read-ом? И чисто из спортивного интереса: можно ли, пусть даже сильно извратившись, таки прочитать double через итератор? Как это сделать (хотя бы приблизительное решение)?

one_more_hokum ★★★
() автор топика

уверен что в google сидят добрые «одмины» и Вас скоро разбанят, пока же почитайте вот здесь, уверен Вы там найдёте много нового

//hint: если что, искать по слову fstream

shty ★★★★★
()
Ответ на: комментарий от shty

При натравливании std::istream_iterator на std::fstream вызов tellg() для него возвращает -1, и никакими уговорами (std::advance, seekg) сдвинуть с места его не удаётся. ЧЯДНТ?

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

я только одного не пойму, накукуй Вам там tellg() и прочая?

всё работает и без них прекрасно

#include <algorithm>
#include <iterator>
#include <fstream>

int main(void) {

	const char* f_name = "test.bin";

	//definig data vectors
	std::vector<double> ov, iv;

	//filling output data vector with random data
	for(int index = 0; index < 10; index++) {
		double d_val = rand() / 1000000.0;
		ov.push_back(d_val);
	}

	//saving output data vector to a binary file
	std::ofstream ofs(f_name, std::ios::binary);

	std::copy(
		ov.begin(), ov.end(), 
		std::ostream_iterator<double>(ofs, (char*)NULL) );

	ofs.close();

	//reading data from binary file to input vector
	std::ifstream ifs(f_name, std::ios::binary);
	std::istream_iterator<double> ii(ifs);

	std::copy(
		ii, std::istream_iterator<double>(),
		std::back_inserter(iv)				);

	ifs.close();

	//print data to compare results
	for(int index = 0; index < ov.size(); ++index) {
		printf("%8.4f %8.4f\n", ov[index], iv[index]);
	}

	return 0;
}

//а вот подсветка кода не работает :)

shty ★★★★★
()
Ответ на: комментарий от shty

> накукуй Вам там tellg() и прочая?

Да это я так... Проверял.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от shty

Код хорош, но результаты при считывании с файла отличаються от записанного туда же ранее:

~/tmp $ ./binary_ofstream 
1804.2894	1804.2985
846.9309	  0.9312
1681.6928	  0.6917
1714.6369	  0.6420
1957.7478	  0.7542
424.2383	  0.2387
719.8854	  0.8852
1649.7605	  0.7660
596.5166	  0.5171
1189.6414	  0.6400
~/tmp $ cat test.bin
1804.29846.9311681.691714.641957.75424.238719.8851649.76596.5171189.64

Наверное, причиной тому есть отсутствия какого-либо разделителя между числами в файле?

blinkenlichten
()
Ответ на: комментарий от blinkenlichten

Код хорош, но результаты при считывании с файла отличаються от записанного туда же ранее

хме... у меня совпадало, вот прогон:

  0.0000   0.0000
  0.0185   0.0185
  0.0063   0.0063
  0.0265   0.0265
  0.0192   0.0192
  0.0157   0.0157
  0.0115   0.0115
  0.0294   0.0294
  0.0270   0.0270
  0.0245   0.0245
shty ★★★★★
()
Ответ на: комментарий от shty

Заменив строчку

     double d_val = (rand() ) / 100000.0; 
На эту :
     double d_val = (rand() % 10000) / 100000.0; 

Всё заработало. Не понятно почему rand() так выделывается. В случае неиспользования rand() таких приколов не будет, думаю, спасибо за код :-)

 bogdan@omicron:~/tmp> g++ --version
g++ (SUSE Linux) 4.4.1 [gcc-4_4-branch revision 150839]
Copyright (C) 2009 Free Software Foundation, Inc.
blinkenlichten
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.