我试图用Procmon分析使用ifstream的基本读取操作。
用于读取操作的部分代码,其中我试图从文件中读取16kb大小的数据:
char * buffer = new char[128000];
ifstream fileHandle("file.txt");
fileHandle.read(buffer, 16000);
cout << buffer << endl;
fileHandle.close();
在Procmon中有4个ReadFile操作,其中包含以下详细信息:
偏移:0,长度:4,096,优先级:正常
偏移量:4,096,长度:4,096
偏移量:8,192,长度:4,096
偏移量:12,288,长度:4,096
那么这意味着每个4kb大小有4个操作吗?如果是这样,为什么会发生这种情况,而不是只有一个16 kb大小的ReadFile操作。
答案 0 :(得分:1)
那么这意味着每个4kb大小有4个操作吗?
这正是它所说的。
如果是这样,为什么会发生这种情况,而不是只有一个16 kb大小的ReadFile操作。
仅仅因为你要求16000个字节并不意味着ifstream
实际上可以在一次操作中读取16000个字节。文件系统通常不允许这么大的读取,通常有一个上限。即使您增加ifstream
内部使用的内部缓冲区的大小,仍然无法保证文件系统将支持更大的读取大小。
read()
的合同是它返回请求的字节数,除非遇到EOF /错误。它如何实现内部读取是一个实现细节。在这种情况下,ifstream
必须读取4个4KB块才能返回16000个字节。
答案 1 :(得分:1)
那么这意味着每个4kb大小有4个操作吗?
是
如果是这样,为什么会发生这种情况,而不是只有一个16 kb大小的ReadFile操作。
可能是因为编译器附带的标准库将文件流缓冲区的默认大小设置为4 KB;由于read
操作必须通过缓冲区,因此必须填写(通过OS调用)并在满足您的请求之前清空4次。请注意,您可以使用fileHandle.rdbuf->pubsetbuf
更改fstream
的内部缓冲区。