打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C++使用ifstream read读文件时读的大小的问题
userphoto

2022.11.14 湖北

关注

最近在写一个工具,需要去分段读取日志,由于日志很大(可能10GB+),所以不能一次读到内存
我发现,当使用"r"/“ios::in”去读取文件的时候,读取完之后,文件指针的位置会比read的buffer要靠后
比如以下代码

inLogFile.open(file, ios::in);
unsigned long long blockSize = 16 * 1024 * 1024;//16MB
char *tempStr = new char[blockSize];
inLogFile.read(tempStr, blockSize);
cout <<" after read postion" << (long long)inLogFile.tellg() << endl;

此时,按照预想,输出的结果应该是
after read postion16777216
但是,实际上输出的可能是:
after read postion17056210
可以看到,实际的文件指针要更靠后,搜索相关资料研究后,发现这个是由于日志文件的格式导致的,如果使用"r"/“ios::in”去读取文件,在windows下,会将换行符从\r\n变成\n,这样实际上的文件指针就更加靠后了
此时,可以使用"rb",或者ios::in|ios::binary来打开文件,这样就不会转换格式

inLogFile.open(file, ios::in|ios::binary);
unsigned long long blockSize = 16 * 1024 * 1024;//16MB
char *tempStr = new char[blockSize];
inLogFile.read(tempStr, blockSize);
cout <<" after read postion" << (long long)inLogFile.tellg() << endl;

此时,输出的结果就和预想的完全一致
after read postion16777216

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
statfs函数
c++中ifstream一次读取整个文件
would do和used to do表过去习惯时到底有什么差别?
C语言文件操作(一)
飞狐警告文件alert.alt的读写
使用mozilla pdf.js在Android WebView中显示PDF文件Android API级别低于19
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服