我试图分析一个基本的读取操作使用ifstream与Procmon。
用于读取操作的部分代码中,我试图从一个文件中读取16 to大小的数据:
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操作。
发布于 2015-08-25 21:44:14
因此,这是否意味着每4kb大小有4个操作?
是。
如果是这样的话,为什么会发生这种情况,而不是只有一个16 kb大小的ReadFile操作。
可能是因为编译器附带的标准库将文件流缓冲区的默认大小设置为4KB;由于read操作必须通过缓冲区,所以必须(通过OS调用)填充它,并在满足请求之前清空4次。请注意,您可以使用fstream更改fileHandle.rdbuf->pubsetbuf的内部缓冲区。
发布于 2015-08-25 21:43:52
因此,这是否意味着每4kb大小有4个操作?
它就是这么说的。
如果是这样的话,为什么会发生这种情况,而不是只有一个16 kb大小的ReadFile操作。
仅仅因为您请求16000字节,并不意味着ifstream在一次操作中实际上可以读取16000字节。文件系统通常不允许如此大的读取,通常有一个上限。即使您增加了ifstream使用内部的内部缓冲区的大小,这仍然不能保证文件系统将符合更大的读取大小。
read()的约定是,除非遇到EOF/错误,否则它返回请求的字节数。它是如何在内部完成这种读取的,这是一个实现细节。在这种情况下,ifstream必须读取四个4KB块才能返回16000字节。
https://stackoverflow.com/questions/32214514
复制相似问题