最近在写一个工具,需要去分段读取日志,由于日志很大(可能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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)