如何检查 ifstream 是否是 C++ 中文件的结尾
How to check whether ifstream is end of file in C++
我需要按顺序读取一个大文件(大约 10GB)的所有块,该文件包含许多带有几个字符串的浮点数,如下所示(每个项目由""拆分):
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
是否是文件结尾。
我在带有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;
}
while( file_input.peek() != EOF )
{
// code
}
基本上peek()
将读取下一个char
而不提取它。
因此,您可以简单地将其与 EOF
进行比较。
相关文章:
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- 如何在 DevC++ 上显示带有中文字母的行?
- VSCode C++调试文件名中包含中文字符的文件时插件损坏
- 提取用中文写的评论,并使用一些脚本将它们翻译成英文
- 使用fstream用中文/日文编写的文本,无法正确读取文件
- 如何将包含中文或韩语的字符串转换为十六进制/字节
- 嵌入式系统中未显示的中文字符(yocto,Qt 5.5.1) - 为什么Qt不使用系统字体?
- 如何在没有错误的情况下展示特殊的中文,韩语,日本角色
- 如何解析 UTF-8 中文字符串
- 为什么这个状态栏输出乱码的中文样字符
- 在VC 6中显示中文
- 翻译演示翻译中文失败,可能是编码失败
- c1xx:致命错误C1083:无法打开源文件-使用某些中文或爪哇语
- 我怎样才能得到中文字符串
- 如何让 FLTK 1.3.0 在 Ubuntu Linux 中支持中文
- 使用atlcov.h/W2A和中文文本的C++Utf-8转换
- gtkmm 中文本字段的意外行为,strncpy
- 通过套接字发送结构并接收中文字母
- 从C/C++中的.csv文件中读取中文字符
- 尝试在代码块13.12中复制strlwr时出现奇怪的ASCII响应(中文)