C ++ ifstream.read;читает байты меньше заданных n байтов - PullRequest
0 голосов
/ 19 февраля 2012

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

Это почтовый файл, который я пытаюсь разделить: В тексте первые несколько байтов выглядят так:

text
(де-ведро как символы на самом деле 2 символа)

Кажется, он захватывает первые 5 байтов, как и должно, но потом просто останавливается и переходит к следующему блоку чтения.

Так как это буфер из 512, все после первых 5 байтов является мусором. Я использую ifstream. И режим установлен на Binary.

Есть предложения?

void FileProcessor::send()
{
    //If no file is opened return
    if(!_file.is_open()) return;
    //Reset position to beginning
    _file.seekg(0, ios::beg);

    //Result buffer
    char * buffer;
    char * partBytes = new char[_bufferSize];

    //Read the file and send it over the network
    while (_file.read(partBytes, _bufferSize))
    {

        buffer = Packet::create(Packet::FILE,partBytes);
        Packet *p = Packet::create(buffer);
        //cout <<  strlen(partBytes);
        //p->PrintHex(buffer,_bufferSize+Packet::HeaderSize);

        //break;
        cout << "Normal size : \t" << strlen(partBytes)<< "\tPacketSize: \t" << p->getLength()<<"\n";
        //cout << strcmp(p->getData().c_str(),partBytes) << "\n";
        writeToFile(p->getData().c_str(),p->getData().length());
        delete p;
    }
    //Write final bytes if any
    if(_file.gcount())
    {
        //writeToFile(partBytes, _file.gcount());


        buffer = Packet::create(Packet::FILE,partBytes);
        Packet *p = Packet::create(buffer);

        writeToFile(p->getData().c_str(),p->getData().length());
        //cout << p->getLength() << "\n";
        delete p;

    }   

    //cout<< *p << "\n";
    delete [] partBytes;
}

Я сейчас тестирую прямое чтение и запись.

1 Ответ

0 голосов
/ 19 февраля 2012

Внутри вашего цикла, вместо того, чтобы предполагать, что он всегда читает полный буфер данных, используйте gcount(), чтобы найти, сколько он на самом деле прочитал, и передать столько.

Я чувствую себя обязанным добавить, что это:

    buffer = Packet::create(Packet::FILE,partBytes);
    Packet *p = Packet::create(buffer);

выглядит довольно странно для меня. Не уверен, что это неправильно, но не сразу очевидно, что это правильно (и если это правильно, дизайн кажется немного странным).

Я бы также пропустил динамическое размещение и удаление:

char * partBytes = new char[_bufferSize];
// ...
delete [] partBytes;

и используйте вместо него std::vector<char>.

...