Не все байты отображаются при чтении файла в С++

Я пытаюсь прочитать файл, содержащий данные в двоичном моде. Размер файла 28 байт, но когда я пытаюсь прочитать этот файл, у меня только 22 байта. Я уже пытался изменить информацию внутри файла, но в нем все еще отсутствуют некоторые байты. Понятия не имею почему. PS: я знаю, какие данные находятся внутри файла, но они не читаются ни в каком стандарте компьютерной кодировки символов. Код, используемый для чтения файла:

std::string line{ "" };
    std::string buffer;
    while (std::getline(file, line))
        buffer += line;
    file.close();

c++
person Ismaël Gaye    schedule 08.07.2021    source источник
comment
Если ваши данные двоичные, вы, вероятно, не захотите читать их так, особенно если ваша ОС - MS Windows.   -  person drescherjm    schedule 08.07.2021
comment
Вы пытаетесь прочитать двоичные данные как текст, что не сработает. Найдите в Google примеры того, как читать двоичные файлы, или обратитесь к хорошей книге по C++   -  person NathanOliver    schedule 08.07.2021
comment
Связано: https://stackoverflow.com/a/5420568/487892   -  person drescherjm    schedule 08.07.2021
comment
Я хочу прочитать все бинарные данные, потому что это я их вставил. Поэтому, если я могу восстановить их полностью, это лучше (обязательно)   -  person Ismaël Gaye    schedule 08.07.2021
comment
Прочитав его таким образом, вы не сможете восстановить данные.   -  person drescherjm    schedule 08.07.2021
comment
@IsmaëlGaye: На C++ определенно можно читать двоичные файлы. std::string и std::getline не подходят для двоичных данных. Даже fstream не может переносимого доступа к двоичным данным (у него всегда есть фасет символов, выполняющий преобразование текста, бинарные данные требуют установки неоперационного фасета, а его настройка не является переносимой).   -  person Ben Voigt    schedule 08.07.2021
comment
это работает с std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(file), {}); спасибо (у меня есть правильное количество байтов)   -  person Ismaël Gaye    schedule 08.07.2021


Ответы (1)


Не читайте двоичные данные, как их текст. Если вы хотите прочитать двоичные данные в буфер (например, загрузить их в std::vector), вот один рецепт, который использует stdlib:

#include <cstdio>
#include <cstdlib>
#include <vector>

FILE *f = fopen("myfile.bin", "rb");
if (f == nullptr) { /* ... */}
fseek(f, 0, SEEK_END);
auto size = ftell(f);
fseek(f, 0, SEEK_SET);
std::vector<uint8_t> buffer(size);
if (fread (buffer.data(), 1, size, f) != size) { /* ... */ }
fclose(f);
person wcochran    schedule 08.07.2021