Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中无缓冲地打开和读取文件?_C_Io - Fatal编程技术网

如何在C语言中无缓冲地打开和读取文件?

如何在C语言中无缓冲地打开和读取文件?,c,io,C,Io,我想对一个在文件上运行的算法进行基准测试。该算法迭代N轮,每轮读取一个数据块,做一些神奇的事情,并设置下一个块的偏移量 以下是伪代码: int run_algorithm(int offset) { char *fname = "database.dat"; fd = open(fname, O_RDONLY); // read the desired block to memory block_size = 1024 * 1024; char *bu

我想对一个在文件上运行的算法进行基准测试。该算法迭代N轮,每轮读取一个数据块,做一些神奇的事情,并设置下一个块的偏移量

以下是伪代码:

int run_algorithm(int offset) {

    char *fname = "database.dat";
    fd = open(fname, O_RDONLY);

    // read the desired block to memory
    block_size = 1024 * 1024;
    char *buf = malloc(block_size);
    lseek(fd, offset, SEEK_SET);
    read(fd, &buf, block_size);

    int new_offset;
    // do magic stuff with buf
    // and set a new offset

    close(fd);
    return new_offset;
}

int main() {

    int i;

    //init offset
    int offset = 0;

    // iterate N times
    for (i = 0; i < N; i++) {
        offset = run_algorithm(offset);
    }

    return 0;
}
int运行算法(int偏移量){
char*fname=“database.dat”;
fd=打开(仅fname,Ordu);
//将所需的块读取到内存中
块大小=1024*1024;
char*buf=malloc(块大小);
lseek(fd、偏移、寻道集);
读取(fd和buf、块大小);
int新_偏移量;
//用buf做魔术
//并设置一个新的偏移量
关闭(fd);
返回新的_偏移量;
}
int main(){
int i;
//初始偏移量
整数偏移=0;
//迭代N次
对于(i=0;i
我知道操作系统有热缓存和冷缓存。我想实现冷缓存案例。在每个run_algorithm()调用中,打开文件时不应有缓冲。换句话说,我不希望操作系统将文件的一部分存储在内存中的某个地方,以加速open()和seek()


有没有办法专门设置open()和seek(),而无需缓冲?

您不能禁用硬盘驱动器和操作系统中的所有缓存

但如果您接受对程序之外的所有内容进行基准测试,则可以在C运行时库中禁用缓冲:

setvbuf(fd, NULL, _IONBF, 0);

必须在fopen操作后立即调用该函数。请参阅。

否中的详细信息,即使您可以告诉操作系统不要缓冲,您也不知道驱动器控制器或板载磁盘缓存是否会影响它。您是在Linux设备上吗?如果是,您可以在
open()
调用中使用
O\u DIRECT
?这可能会减少系统执行的缓存量,至少在写操作期间是这样。但是,您进入了敏感区域,系统将非常长的时间来确保磁盘数据被缓存。为什么不在
main
中打开您的文件,并将
file*fp
参数传递给
run\u algorithm
以避免重复打开/关闭文件?您可以将
for
循环移动到
run\u算法
,还可以将指向
int
(或数组地址)的指针传递到
run\u算法
,构建偏移数组,并让
run\u算法
返回指向数组的指针(以及能够使用作为函数指针传递的数组)