2015-01-20 2 views
0

я должен прочитать двоичный файл, который структурирован так: 1 байт для N, N байт, 4 байта, и т.д.ifstream двоичный файл неправильно

Вот мой код:

char length; 
file >> length; 

char c[ 64 ]; 
file.read(c, length); 

c[ length ] = 0; 

int ver; 
file >> ver; 

Проблема : ver всегда 0 (на ~ 2500 файлов), в то время как этого не должно быть. length вывести правильное значение, c тоже. И после вызова read, tellg возвращает -1.

+3

У вас есть код, который создает вход файл? Если файл действительно является двоичным файлом, вы не должны использовать 'file.read (& length, 1);' и 'file.read (& ver, sizeof (int));'? –

+0

Я использую std :: ifstream file (путь, std :: ios :: binary) для создания файла. Поэтому я попробовал ваше решение, это сработало. Но я не понимаю, >> оператор не может использоваться вместо чтения? И я должен был бросить & ver на char *, чтобы заставить это работать, почему? – Aulaulz

+0

И каков код, который записывает данные в файл? –

ответ

2

Вы сказали

1 байт для N, N байт, 4 байта, и т.д.

Я предложил бы использовать:

char length; 
file.read(&length, 1); 

// Check the value of length and make sure you have enough space. 
if (length > 63) 
{ 
    // Deal with error condition 
} 

char c[ 64 ]; 
file.read(c, length); 

c[ length ] = 0; 

// Use a type that is know to be 4 bytes wide. 
// Use read() instead of formatted input. 
int32_t ver; 
file.read(reinterpret_cast<char*>(&ver), sizeof(ver)); 
+0

Есть ли способ избежать броска & ver? Получение ошибки, если я этого не сделаю. – Aulaulz

+0

К сожалению, нет. –

+0

Хорошо, спасибо за ответы! – Aulaulz

Смежные вопросы