Как проверить, является ли поток потоком конца файла в переполнении стека

Мне нужно последовательно прочитать все блоки одного большого файла (около 10 ГБ), файл содержит много операций с несколькими строками, например так (каждый элемент разделен символом \ n):

6.292611
-1.078219E-266
-2.305673E+065
sod;eiwo
4.899747e-237
1.673940e+089
-4.515213

Я читаю MAX_NUM_PER_FILE элементы каждый раз и обрабатывать их и записывать в другой файл, но я не знаю, когда ifstream Я отправил.
Вот мой код:

ifstream file_input(path_input);  //my file is a text file, but i tried  both text and binary mode, both failed.
if(file_input)
{
file_input.seekg(0,file_input.end);
unsigned long long length = file_input.tellg();    //get file size
file_input.seekg(0,file_input.beg);

char * buffer = new char [MAX_NUM_PER_FILE+MAX_NUM_PER_LINE];
int i=1,j;
char c,tmp[3];
while(file_input.tellg()<length)
{
file_input.read(buffer,MAX_NUM_PER_FILE);
j=MAX_NUM_PER_FILE;
while(file_input.get(c)&&c!='\n')
buffer[j++]=c;   //get a complete item

//process with buffer...

itoa(i++,tmp,10);    //int2char
string out_name="out"+string(tmp)+".txt";
ofstream file_output(out_name);
file_output.write(buffer,j);
file_output.close();
}

file_input.close();
delete[] buffer;
}

Мой код идет не так, length больше реального размера файла. я пытался file_input.good() или же !file_input.eof()они не работали, getline(file_input,s) это хорошо, но гораздо медленнее, чем read, я хочу read, но я не знаю, как проверить, ifstream это конец файла.

Я делаю свою работу в WINDOWS 7 с VS2010.

Я искал, но нет никакого ответа по этому поводу, Как открыть файл с помощью ifstream и продолжать читать его до конца эта ссылка не может ответить на мой вопрос.


Обновление, Проблема решена

Привет всем, я понял, что это моя вина. И то и другое while(file_input.tellg()<length) а также while(file_input.peek()!=EOF) работать отлично! while(file_input.peek()!=EOF) Рекомендовано.

Дополнительные элементы, написанные после конца файла, — это оставленные элементы в buffer написано в последний раз.

Вот правильный код:

ifstream file_input(path_input);
if(file_input)
{
//file_input.seekg(0,file_input.end);
//unsigned long long length = file_input.tellg();   //get file size
//file_input.seekg(0,file_input.beg);

char * buffer = new char [MAX_NUM_PER_FILE+MAX_NUM_PER_LINE];
int i=1,j;
char c,tmp[3];
while(file_input.peek()!=EOF)
{
memset(buffer,0,sizeof(char)*(MAX_NUM_PER_FILE+MAX_NUM_PER_LINE));  //clear first!
file_input.read(buffer,MAX_NUM_PER_FILE);
j=MAX_NUM_PER_FILE;
while(file_input.get(c)&&c!='\n')
buffer[j++]=c;

itoa(i++,tmp,10);//int2char
string out_name="out"+string(tmp)+".txt";
ofstream file_output(out_name);
file_output.write(buffer,strlen(buffer));   //use the correct buffer size instead of j
file_output.close();
}

file_input.close();
delete[] buffer;
}

4

Решение

while( file_input.peek() != EOF )
{
// code
}

В принципе peek() будет читать следующий char не извлекая его.

Таким образом, вы можете просто сравнить его с EOF,

7

Другие решения


По вопросам рекламы [email protected]