Является ли readsome () подходящим для чтения двоичных данных в Windows? - PullRequest
0 голосов
/ 10 октября 2018

Контекст: Я пытаюсь прочитать содержимое изображения PNG на C ++, чтобы позже отправить его в мое приложение для Android.Для этого я открываю файл в двоичном режиме, читаю его содержимое кусками по 512 байт, а затем отправляю данные в приложение.Я на Windows.

Проблема: Я использую экземпляр ifstream и функцию readsome () , как показано ниже, и она возвращаетя 512, что я и ожидал, поскольку попросил прочитать 512 байт.Тем не менее, похоже, что в моем буфере далеки от 512 байт, что меня смущает.Пока я отлаживаю свою программу шаг за шагом, число символов в буфере кажется случайным, но никогда не бывает 512, как ожидалось.

Код:

int currentByteRead = 0;
std::ifstream fl(imgPath.toStdString().c_str(), ios_base::binary);
fl.seekg( 0, std::ios::end );
int length = fl.tellg();

char *imgBytes = new char[512];

fl.seekg(0, std::ios::beg);
// Send the img content by blocks of 512 bytes
while(currentByteRead + 512 < length) {
    int nbRead = fl.readsome(imgBytes, 512); // nbRead is always set to 512 here

    if(fl.fail()) {
        qDebug() << "Error when reading file content";
    }

    sendMessage(...);
    currentByteRead += 512;
    imgBytes = new char[512];
}

// Send the remaining data
int nbRemainingBytes = length - currentByteRead;
fl.readsome(imgBytes, nbRemainingBytes);
sendMessage(...);
fl.close();
currentByteRead += nbRemainingBytes;

Длина, которую я получаю в начале, является правильной, и, похоже, ошибки нет.Но это как если бы не все данные были скопированы в буфер во время вызова readsome () .

Вопросы: Неужели я что-то не так понял относительно функция readsome () ?Есть ли что-то, связанное с Windows, вызывающее такое поведение?Есть ли более подходящий способ продолжить?

1 Ответ

0 голосов
/ 15 октября 2018

Я наконец нашел способ сделать то, что хотел, и, как предложил Дэвид Херринг, я приведу здесь свой ответ.

Мои мысли по поводу проблемы: Если я использую переменную std :: ifstream :: pos_type вместо int , правильное числобайтов читается и помещается в буфер.Это не имело место при использовании int, как будто символы записывались только в буфер до заданной (случайной?) Точки.Я не уверен, чтобы понять, почему это произошло.Я предположил, что у меня были проблемы с символами '\ n', но случайность конечного содержимого буфера для меня все еще неясна.

Исправление: Это рабочий код, который янаконец, тем не менее достиг.Начав с этого, я смог сделать то, что имел в виду.

std::ifstream ifs(imgPath.toStdString().c_str(), std::ios::binary|std::ios::ate);
std::ifstream::pos_type pos = ifs.tellg();
int length = ifs.tellg();
std::vector<char>  result(pos);
ifs.seekg(0, std::ios::beg);
ifs.read(result.data(), pos);
ifs.close();

Надеюсь, это поможет другим.Спасибо Дэвид за ваши предложения.

...