C++使用ifstream read读文件时读的大小的问题

本文探讨了在处理大型日志文件时,如何避免因换行符转换导致的文件指针位置偏移问题。通过介绍使用'rb'模式或ios::in|ios::binary打开文件的重要性,确保正确读取并定位文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写一个工具,需要去分段读取日志,由于日志很大(可能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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值