gpt4 book ai didi

c++ - 如何检查ifstream是否在C++中的文件结尾

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:39 26 4
gpt4 key购买 nike

我需要按顺序读取一个大文件(大约 10GB)的所有 block ,该文件包含许多带有几个字符串的 float ,如下所示(每个项目由 '\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 进行工作。

我已经搜索过了,但是没有任何答案,How to open a file using ifstream and keep reading it until the end此链接无法回答我的问题。


更新,问题解决

大家好,我发现这是我的错。两者 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;
}

最佳答案

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

基本上 peek() 将读取下一个 char 而不提取它。

所以你可以简单地将它与 EOF 进行比较。

关于c++ - 如何检查ifstream是否在C++中的文件结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28105254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com