c/c++语言开发共享在C中多次从stdin读取相同的数据

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

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

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

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

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

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

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

    在一个管道中,一个数据已被写入,它已经消失,所以你必须将它存储在某个地方以免丢失。

    你能做到这一点的唯一方法是“模仿”其他程序的行为 – 这在cat情况下应该是微不足道的。

    确切地说,您的代码是着名的UUOC(Unneecessary Use of cat )的一个很好的例子。

    如果要求您从标准输入读取 – 好吧,那不必是管道。 代替

     cat file | program 

    你可以做

     program < file 

    这并没有给你一个管道,而是直接访问该文件,包括寻找的能力。

    如果可能,您可以使用此function,如果不可以,请自行缓存数据或拒绝运行。

    但是,如果要求您接受各种标准输入,则此操作无效。

    您询问:

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

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

    代替

     cat  | ./MemorySimulator -f (config file) 

    您可以使用:

     ./MemorySimulator  -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); } 

      以上就是c/c++开发分享在C中多次从stdin读取相同的数据相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519392.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐