Проблемы с пониманием чтения двоичных файлов - PullRequest
2 голосов
/ 26 октября 2019

Ниже приведен код, который я нашел и который, насколько я понимаю, читается в двоичном файле. Я прокомментировал то, что, по моему мнению, происходит, но у меня возникли проблемы с распознаванием, что именно представляет собой блокировка / что она хранит. Это весь двоичный файл?

void BinaryFiles(string sfile){
    streampos size;                               //creates object to store size of file
    unsigned char* memblock;
    ifstream file(sfile, ios::in | ios::binary);  //creates file object(which opens file)
    if (file.is_open())
    {
        file.seekg(0, ios::end);                 //find end of file
        size = file.tellg();                     //sets size equal to distance from beginning
        memblock = new unsigned char[size];      //dynamically allocates memblock to char array
        file.seekg(0, ios::beg);                 //find beginning of file
        file.read((char*)memblock, size);        //this is where confusion begins
        cout << memblock << endl;                //what am I printing?
        file.close();
        delete[] memblock;
}
}

Ответы [ 2 ]

2 голосов
/ 26 октября 2019
//this is where confusion begins

ОК, так что давайте начнем здесь:

file.read((char*)memblock, size); 

Это говорит ifstream о необходимости прочитать определенное количество (size) байтов в некоторой памятибуфер, который вы указываете как указатель (memblock).

Однако, read принимает указатель на char, но буфер был создан как unsigned char, поэтому мы приводим.

cout << memblock << endl;

выведет содержимое файла, который вы только что прочитали. На самом деле, он будет печатать только до появления первого нулевого символа, поэтому он может обрезать содержимое файла. Однако, если файл вообще не содержит нулевого символа, вы получите неопределенное поведение, так как operator<< затем будет читать за пределами буфера.

2 голосов
/ 26 октября 2019

memblock назначается с new unsigned char[size];, где size - размер файла, заданного sfile.

file.seekg(0, ios::end);
size = file.tellg();

Первые две строки используются для получения размера файла

file.read((char*)memblock, size);

Затем выполняется чтение содержимого файла в memblock. Итак, чтобы ответить на ваш вопрос, да memblock хранит все содержимое файла.

С std::basic_istream<CharT,Traits>::read:

Извлекает символы из потока.

Ведет себя как UnformattedInputFunction. После создания и проверки сторожевого объекта извлекает символы и сохраняет их в последовательных местах массива символов, на первый элемент которого указывает s . Символы извлекаются и сохраняются до тех пор, пока не произойдет любое из следующих условий:

  • Количество символов было извлечено и сохранено

  • Конец условия файла происходит навходная последовательность (в этом случае setsets (failbit | eofbit) вызывается). Количество успешно извлеченных символов можно запросить с помощью gcount ().

Наконец, когда вы сделаете:

cout << memblock << endl;

Это напечатает содержимоефайл, который был прочитан в memblock

...