2015-12-20 2 views
2

Что я хочу сделать, отправьте файл 8kB за раз. (Без заполнения памяти с полным файлом)как работает ifstream readsome точно

Это мой код:

while (file.good()){ 
    file.readsome(sinLine,8000); 
    client.saveFile(_return, std::string(sinLine), file_name); 
} 

файл является std::ifstream для текстового файла.
клиент является thriftClient, (я не знаю, как важно, что есть проблемы)
sinLine является char * [8000]

Проблема заключается в том, что полученный для файла 242.2kB и послал файл 142.6kB.

В отладчике я заметил, что он прошел цикл более 18 раз (142/8 = 17,25), но он не продолжается вечно (я точно не знаю, сколько раз, но это, вероятно, 242/8 раз).

Я также заметил, что каждый третий цикл (3, 6, 9 ...) значение sinLine не показывалось в моей среде IDE (QtCreator).

Так что мои вопросы, как работает readsome()? и я использую его правильно? или я должен использовать другую функцию? или, может быть, преобразование из char * в std::string не верное?

ответ

3

Функция readsome() довольно бесполезна и, вероятно, не делает то, на что вы надеетесь. Он определяет количество гарантированных доступных символов, вызывая in.rdbuf()->in_avail(), который сам вызывает функцию virtualshowmanyc(). Реализация этой функции по умолчанию заключается в возврате числа символов, которые, как известно, являются в буфере (то есть egptr() - gptr() на std::streambuf). Затем функция переходит к простому read(), что многие символы используют in.rdbuf()->sgetn(buffer, n)).

Обратите внимание, что вы можете использовать in.gcount(), чтобы определить, как могут отображаться символы, но последняя неформатированная функция ввода. Это дает вам лучшее количество прочитанных символов, чем определение количества символов до следующего нулевого символа. Тем более, что неформатированные входные функции не делают попытки прервать считываемые данные.

Кроме того, ваш чек на file.good() невелик: предполагается, что вам не повезло, и последнее успешное чтение заканчивается точно в последнем элементе, последний вход будет обработан дважды. Я бы настоятельно рекомендовал использовать цикл больше:

for (char buffer[8196]; file.read(buffer, sizeof(buffer));) { 
    client.saveFile(_return, std::string(buffer, buffer + file.gcount()), file_name); 
} 
+0

Благодарим вас за ответ! Я попробовал ваше решение, и он работал намного лучше! К сожалению, файл все еще не того же размера:/вместо 142kB это сейчас 160kB. Не могли бы вы представить, почему это так? – Anthony

+0

@ Энтони: какие отличия? Вы открыли исходный файл в двоичном режиме? Если исходный файл использует текстовый режим, и адресат не переписывает последовательности строк, которые могут учитывать некоторые отличия. Возможно, будет разумно отдельно проверить, что чтение файла работает ОК, записав его во временный файл. –

+0

Я заметил, что проблема была, это была глупая ошибка, я добавлял «\ n» на стороне записи. LOL удалил ее, и теперь она работает так же, как я хочу! большое спасибо, я принял ваш ответ! – Anthony

Смежные вопросы