Здравствуйте!
Есть 2 проблемы с побайтовым чтением бинарного файла при помощи std::ifstream
Следующий код выдает при чтении бинарного файла с содержимым
0x0D 0x0A 0x0D 0x0A следующее
#0 ... 0x0a ... good ? true ... 0/2
#1 ... 0x0a ... good ? true ... 2/4
#2 ... 0x00 ... good ? false ... 4/-1
а при при чтении бинарного файла с содержимым
0x01 0x02 0x03 0x04 следующее
#0 ... 0x01 ... good ? true ... 0/1
#1 ... 0x02 ... good ? true ... 1/2
#2 ... 0x03 ... good ? true ... 2/3
#3 ... 0x04 ... good ? true ... 3/4
#4 ... 0x00 ... good ? false ... 4/-1
Вопрос 1. Как заставить ifstream правильно читать последовательности CR/LF
Вопрос 2. Как правильно смотреть состояние бинарного потока std::ifstream, чтобы не было чтения "несуществующего байта" ?
Заранее благодарен за ответы.
#include <iostream>
#include <fstream>
#include <iomanip>
int main ( int argc, char **argv ) {
if ( 2 != argc ) {
std::cout << "Usage : " << argv[0] << std::endl;
return 1;
}
std::ifstream in ( argv[1], std::ios_base::in, std::ios_base::binary );
if ( !in.is_open() ) {
std::cout << "Failed to open : " << argv[1] << std::endl;
return 2;
}
int i = 0;
while ( in.good() ) {
char data = 0;
std::fstream::pos_type previous_pos = in.tellg();
in.read ( & data, sizeof ( char ) );
std::fstream::pos_type current_pos = in.tellg();
std::cout
<< "#" << i++ << " ... 0x" << std::hex << std::setw ( 2 ) << std::setfill('0') << static_cast <int> ( data )
<< " ... good ? " << std::boolalpha << in.good() << " ... " << std::dec << previous_pos << "/" << current_pos << std::endl;
}
in.close();
return 0;
}