Не могу записать последнюю часть текстового файла в cout, используя ifstream - PullRequest
0 голосов
/ 19 июля 2011

Приведенный ниже код будет печатать весь текст из образца текстового файла, который я использую, за исключением последнего небольшого фрагмента.Я думаю, это как-то связано с тем, что eof или размер байта, который я использую, работают не так, как я ожидаю.

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[]){
int length;
char* buffer;

//get file stream and open local file.
ifstream stream;
stream.open("SampleFile.txt", ios::binary);
stream.seekg(0, ios::end);
length = stream.tellg();
stream.seekg(0, ios::beg);

//read stream 1024 bytes at a time until all bytes of file are used
buffer = new char[1024];
bool eof = false;
while(!eof)
{
    stream.read(buffer, 1024);
    cout.write(buffer, 1024);
    if(stream.eof())
        eof = true;
    //cout << i << endl;
    //cout.write(buffer, 1024);
}

stream.close();
delete[] buffer;
return 0;
}

Чего мне не хватает?

Ответы [ 4 ]

3 голосов
/ 19 июля 2011

Как вы уже знаете, у вас неправильный размер буфера. Другая вещь - это чтение менее 1024 символов (произойдет в конце, если ваш файл не имеет точно n*1024 байтов). Воспользуйтесь преимуществом istream::gcount, которое даст вам количество символов, извлеченных при последнем прочтении:

char buffer[1024];
while(stream)
{
    stream.read(buffer, 1024);
    cout.write(buffer, stream.gcount());
}
2 голосов
/ 19 июля 2011

1) Вы неправильно рассчитываете размер конечного буфера.

2) Вы неправильно распознаете все возможные условия ошибки.

Попробуйте:

while(stream) {
    stream.read(buffer, 1024);
    cout.write(buffer, stream.gcount());
}

PS .Если вы действительно пытаетесь скопировать указанный файл в стандартный формат, есть гораздо более простой способ:

ifstream stream("SampleFile.txt", ios::binary);
std::cout << stream.rdbuf();
0 голосов
/ 19 июля 2011

Поскольку вы знаете размер файла, почему бы не прочитать весь файл сразу?

buffer = new char[length];

stream.read( buffer, length );
cout.write( buffer, length );

delete[] buffer;
0 голосов
/ 19 июля 2011

Похоже, проблема в том, что ваше последнее чтение не соответствует размеру вашего буфера. Вы должны рассматривать это как особый случай. Подробнее см. http://www.cplusplus.com/reference/iostream/istream/read/.

О, похоже, ваш буфер имеет длину 8 байтов, но вы прочитали 1024 байта. Это плохо.

...