2016-04-13 9 views
0

В моем проекте мне нужно записать в двоичный файл последовательные неподписанные ints, и важно, чтобы каждое число занимало точные 4 байта. Но когда я открываю двоичный файл с шестнадцатеричным редактором, я вижу это странное событие: цифры написаны правильно только до номера 9; перед номером 10 он добавит еще один дополнительный байт и напишет «13» (и уже испорчен моим файлом). И странные вещи продолжают происходить - из числа 30 и далее будут записаны разные символы, по одному в сторону каждого номера. Почему? как исправить, по крайней мере вопрос размера? Вот мой простой пример кода:не может правильно записать большие неподписанные ints в двоичный файл - C++

int main() 
{ 
    string filename; 
    cin >> filename; 
    fstream mystream; 
    mystream.open(filename, ios::out); 
    if (mystream) 
     for (unsigned int i = 0; i < 3200; i++) 
      mystream.write((char*)&i, sizeof(unsigned int)); 
    mystream.close(); 

    return 0; 
} 

и прилагается изображение того, что я вижу в файле: file capture on hex editor

благодаря

+0

Определение 'void main()' в глобальных именах является незаконным в стандартном C++. Вы должны использовать стандартный 'int main()'. – MikeCAT

+0

правый. Я исправлю это; –

ответ

1

Число 10 является символом новой строки LF, и преобразуется в CRLF, потому что файл открывается в текстовом режиме.

Открыть файлы в двоичном режиме для работы с двоичными файлами.

#include <iostream> 
#include <fstream> 
#include <string> 

using std::string; 
using std::cin; 
using std::fstream; 
using std::ios; 

int main() 
{ 
    string filename; 
    cin >> filename; 
    fstream mystream; 
    mystream.open(filename, ios::out | ios::binary); // add OR with ios::binary 
    if (mystream) 
     for (unsigned int i = 0; i < 3200; i++) 
      mystream.write((char*)&i, sizeof(unsigned int)); 
    mystream.close(); 
}