use*_*024 5 c++ line-endings file-handling ifstream seekg
我需要按顺序读取一个大文件(大约10GB)的所有块,该文件包含许多带有几个字符串的浮点数,如下所示(每个项目由'\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;
}
Run Code Online (Sandbox Code Playgroud)
我的代码出错了,length比实际文件大小更大.我试过,file_input.good()或者!file_input.eof(),他们没有工作,getline(file_input,s)是好的,但它比read我想要慢得多read,但我不知道如何检查是否ifstream是文件结束.
我用VS2010在WINDOWS 7中完成我的工作.
我已经搜索过,但没有任何答案,如何使用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;
}
Run Code Online (Sandbox Code Playgroud)
deW*_*eW1 10
while( file_input.peek() != EOF )
{
// code
}
Run Code Online (Sandbox Code Playgroud)
基本上peek()会读取下一个char而不提取它.
所以你可以简单地将它与之比较EOF.