繁体   English   中英

在C中从stdin多次读取相同的数据

[英]Reading the same data from stdin multiple times in C

我正在使用基于跟踪文件的C语言编写一个缓存模拟器,我想通过stdin将其传送到程序中。 这些跟踪文件的最大长度为150亿行,因此我不想将它们存储在活动内存中的任何位置。 我想使用一个在程序输入中指定的配置文件,一次调用针对不同的内存配置多次运行仿真。 程序调用应如下所示:

cat | (trace file) ./MemorySimulator -f (config file)

目前,程序的运行方式是使用配置文件设置模拟参数,然后使用scanf()从stdin读取格式化数据的管道,直到到达跟踪文件的末尾。 然后,它从配置文件进入下一个配置设置,并尝试再次从跟踪文件读取数据。 该过程将继续进行,直到用尽各种配置选项为止。

我遇到的问题是,一旦我在跟踪文件中运行了一次,就无法再次从配置文件中捕获以下内存配置的数据。

有没有一种方法可以回收我的C程序中的管道数据,以便可以从单个程序执行多次运行模拟? 到目前为止,我还没有找到实现此目标的方法。

不,那是行不通的。 这就是管道的本质。

您不能要求不缓存数据,同时又可以重新请求数据。

在管道中,已经写入了一个数据,但数据已经消失了,因此必须将其存储在某个位置,以免丢失。

实现此目的的唯一方法是“模仿”另一个程序的行为-在cat情况下这应该是微不足道的。

确切地说,您的代码是著名的UUOC( cat不必要使用)的一个很好的例子。

如果要求您从stdin中读取-嗯,那不是管道。 代替

cat file | program

你可以做

program < file

这不会给您带来麻烦,而是直接访问文件,包括查找功能。

如果可能,您可以使用它,如果不能,则可以自己缓存数据或拒绝运行。

但是,如果要求您接受所有标准输入,则此方法将无效。

您询问:

有没有一种方法可以回收我的C程序中的管道数据,以便可以从单个程序执行多次运行模拟?

如果您愿意使用跟踪文件作为程序的输入参数,则可以完成所需的操作。

代替

cat <tracefile> | ./MemorySimulator -f (config file)

您可以使用:

./MemorySimulator <tracefile> -f (config file)

main ,使用fopen打开跟踪文件。 将其用于一种配置后,请使用frewind倒带,然后将FILE*重新用于下一种配置。

您也可以在跟踪文件中为每种配置使用fopen/fclose

鉴于您的评论要求您必须从stdin读取数据(并且我想不能要求直接从文件中重定向stdin ),除了您自己缓存数据之外,您别无选择。 由于该数据超过40GB,因此缓存最好是磁盘文件。

我要做的是,在第一遍中,打开一个临时文件以进行读/写,并且当您从等于stdinFILE*变量读取时,还将数据写入临时文件。 在第一遍结束时,将临时文件fp复制到输入fp。

现在,对于其余的通行证,您可以开始倒带输入(临时)文件并读取以供输入。

您可以使用循环计数器来确定每次通过需要执行的操作。

以下是此代码的概述:

infp = stdin;
for (loop = 0; loop < NUM_LOOPS; loop++) {
    if (loop == 0) {
        tmpfp = fopen("tmpfile.tmp", "w");
        //check for errors here
    }
    for (;;) {
        num_read = read(infp, buf, sizeof(buf));
        // check for EOF here and break if so
        if (loop == 0) {
            num_written = write(tmpfp, buf, num_read);
            //check for write errors here
        }

        // Main input processing code
    }

    if (loop == 0) {
        infp = tmpfp;
    }
    rewind(infp);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM