читать из файла, который содержит двоичные числа, замаскированные случайными символами c ++?

0

Я пытаюсь прочитать из файла, который содержит двоичные числа и изменить их на int и сохранить их в массиве. Проблема в том, что когда я пытаюсь посмотреть на файл, цифры замаскированы под случайные бессмысленные символы. Вот как выглядит файл,

\æFQÆ3QËDO ': ^ Þ C2-% <ýÁ-ã +) = ó> Mù ¯M ^ £ ÚUæÑB5q'Ô¡r2ø7grh-6a|4bï ¡! $ imÁ | BW @0U³z½] Nμ)? J ¢ gÕ. W-jum Ö8/s & ²-§niJC ~ · Bº3¸Rãk + x & ãkÎp "éÌEÓ-Üy ùo¬¦+<%j NN # L

Я написал функцию, чтобы попытаться ее прочитать, но она не работает здесь, это функция:

void readf2()
{
    std::ifstream inFile("f2");
    std::string line;
    int num;
    while(!inFile.eof()){
     std::getline(inFile,line);
     num = atoi(line.c_str());
     cout<<num;
     cout<<"\n";
    }
}

Я не знаю, как правильно прочитать этот файл. Как мне это сделать. является atoi неправильно или я должен попробовать что - то вроде strtoi? Спасибо всем заранее.

Теги:

2 ответа

5
Лучший ответ

Двоичные данные не являются символами. Вы не можете читать их как символы и не можете использовать ввод строки (например, std::getline) для чтения из файла.

Для начала вам следует открыть файл в двоичном режиме:

std::ifstream inFile("f2", std::ios_base::binary);

Затем читайте с использованием неотформатированных нетекстовых функций, таких как std::istream::read:

std::int32_t buffer[512];
while (inFile.read(reinterpret_cast<char*>(buffer), sizeof(buffer)) { ... }

Если операция чтения завершается успешно, у вас есть массив из 512 32-разрядных целых чисел (используйте std::istream::gcount чтобы узнать, сколько байтов было прочитано).

Также обратите внимание на идиоматический способ чтения в цикле. Когда вы делаете, например, while (!inFile.eof()) вы рискуете попытаться прочитать один раз для многих, поскольку флаг EOF не установлен до тех пор, пока не завершится операция чтения.


Если вы не знаете формат данных в файле, будет сложно сказать, правильно ли это указано выше. Данные могут представлять собой структуру, содержащую комбинацию значений от 8 до 64 бит, значений с плавающей запятой или даже фактических текстовых символов.

  • 0
    Спасибо за ответ. Я попробую это сейчас! Я ценю урок!
1

Вам нужно открыть файл как двоичный файл. Вы открываете его как текстовый файл. Смотри сюда:

http://www.cplusplus.com/doc/tutorial/files/

Посмотрите на ios :: двоичную часть.

  • 0
    Кроме того, вы можете упомянуть другие вещи, которые он делает, такие как вызов getline() и atoi() .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню