Размер буфера чтения C ++ - PullRequest
3 голосов
/ 22 июня 2011

Предположим, что этот файл имеет длину 2 и 1/2 блока, с размером блока 1024.

aBlock = 1024;
char* buffer = new char[aBlock];
while (!myFile.eof()) {
    myFile.read(buffer,aBlock);
    //do more stuff
}

В третий раз, когда он читает, он собирается записать половину буфера, оставляя другую половину с неверными данными. Есть ли способ узнать, сколько байтов фактически записано в буфер?

Ответы [ 3 ]

7 голосов
/ 22 июня 2011

istream :: gcount возвращает количество байтов, прочитанных предыдущим чтением.

5 голосов
/ 22 июня 2011

Ваш код слишком сложен и подвержен ошибкам.

Чтение в цикле и проверка только на eof - логическая ошибка, так как это приведет к бесконечному циклу, если при чтении возникнет ошибка(по любой причине).

Вместо этого вам нужно проверить все состояния отказа потока, что можно сделать, просто проверив сам объект istream.

Так как это уже возвращается функцией read, вы можете (и, действительно, должны) структурировать любой цикл чтения следующим образом:

while (myFile.read(buffer, aBlock))
    process(buffer, aBlock);
process(buffer, myFile.gcount());

Это в то же время короче, нескрыть ошибки и является более читабельным , поскольку проверка состояния потока в цикле является установленной идиомой C ++.

0 голосов
/ 22 июня 2011

Вы также можете посмотреть на istream::readsome, который фактически возвращает количество прочитанных байтов.

...