gpt4 book ai didi

c - 从正在主动写入的文件中读取

转载 作者:行者123 更新时间:2023-11-30 19:55:59 25 4
gpt4 key购买 nike

我有两个程序:一个程序 (program1) 连续写入文件,我希望另一个程序 (program2) 连续读取该文件。发生的情况是,我的第二个程序仅读取到执行第二个代码时写入的数据点,然后停止而不是连续读取。

有什么办法可以实现这个目标吗?

基本上,我希望将 program1 的输出用作 program2 的输入。有什么方法可以在 RAM 中而不是在文件中读写,因为磁盘读取会花费更多时间。

代码2:

#include <stdio.h>

int main(){

FILE *fptr;

fptr = fopen("gbbct1.seq","r");

char c;
c = fgetc(fptr);

while (c != EOF){

printf("%c", c);
c = fgetc(fptr);

}

}

我正在寻找独立于平台的方法。如果不可能,我想知道 Linux 平台。我不需要保存读取后的数据。我不想阻止 program1

最佳答案

你的代码最基本的版本需要在遇到EOF时重置文件流状态,然后休眠一段时间。例如,假设 POSIX 并仅使用最简单(最普遍)的函数:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
const char filename[] = "gbbct1.seq";
FILE *fptr = fopen(filename, "r");
if (fptr == 0)
{
fprintf(stderr, "failed to open file '%s' for reading\b", filename);
exit(EXIT_FAILURE);
}

while (1)
{
int c;
while ((c = fgetc(fptr)) != EOF)
fputc(c, stdout);

clearerr(fptr);
sleep(1);
}
/*NOTREACHED*/
return EXIT_FAILURE;
}

sleep()函数休眠整数秒;如果你想要亚秒级 sleep ,你可以考虑 usleep() , nanosleep() , timer_create()以及亲戚等

我有一个名为 dribbler 的程序(因为它将数据滴到其输出):

Usage: dribbler [-hlntV][-s nap.time][-r std.dev][-f outfile][-i infile][-m message][-o openstr][-F format]
-V Print version information and exit
-f outfile Write to named file (dribbler.out)
-h Print this help message and exit
-i infile Read lines from input file
-l Loop back to start of input file on EOF
-m message Write message on each line of output
-n Number lines read from input file
-o openstr Flags passed to fopen() (a+)
-s nap.time Sleep for given interval between writes (1.000 second)
-r std.dev Randomize the time (Gaussian around nap.time with std.dev)
-t Write to standard output instead of file
-F format Printf format to use instead of %zu

我用过:

$ dribbler -s 3 -r 1.3 -f gbbct1.seq &
[1] 81129
$

写入program2编码为读取的控制文件。然后我在其上运行 program2,它在运行过程中产生了输出。

很难在SO上显示时间顺序。我有另一个名为 tstamp 的程序(我一生的故事),它读取输入行并打印它们,并在该行前面加上时间戳:

Usage: tstamp [-hV][-f num][-F format]
-f num Number of fractional digits (0, 3, 6, 9)
-h Print this help message and exit
-F fmt Time format (strftime(3)) to use
-V Print version information and exit

我尝试修改 program2.c 以在我的 Mac(macOS Sierra 10.12.5、GCC 7.1.0)上设置行缓冲模式,方法是在 while 之前添加以下行 循环在 program2.c 中,但它实际上被忽略了,这让我有些惊讶和懊恼:

setvbuf(fptr, 0, _IOLBF, 0);

因此,我将 while 循环重写为:

    while ((c = fgetc(fptr)) != EOF)
{
fputc(c, stdout);
if (c == '\n')
fflush(stdout);
}

然后我就可以在后台运行 dribbler,并且 program2 | tstamp -f 3 获得如下输出:

$ program2 | tstamp -f 3
2017-06-03 23:52:44.836: 0: message written to file
2017-06-03 23:52:44.836: 1: message written to file
2017-06-03 23:52:44.836: 2: message written to file
2017-06-03 23:52:44.836: 3: message written to file
[…more similar lines with the same time stamp…]
2017-06-03 23:52:44.836: 22: message written to file
2017-06-03 23:52:44.836: 23: message written to file
2017-06-03 23:52:44.836: 24: message written to file
2017-06-03 23:52:44.836: 25: message written to file
2017-06-03 23:52:50.859: 26: message written to file
2017-06-03 23:52:54.866: 27: message written to file
2017-06-03 23:52:58.880: 28: message written to file
2017-06-03 23:53:02.888: 29: message written to file
2017-06-03 23:53:05.902: 30: message written to file
2017-06-03 23:53:07.907: 31: message written to file
2017-06-03 23:53:09.913: 32: message written to file
2017-06-03 23:53:12.925: 33: message written to file
2017-06-03 23:53:14.935: 34: message written to file
2017-06-03 23:53:15.938: 35: message written to file
2017-06-03 23:53:19.954: 36: message written to file
2017-06-03 23:53:21.964: 37: message written to file
2017-06-03 23:53:23.972: 38: message written to file
^C
$ kill %1
[1]+ Terminated: 15 dribbler -s 3 -r 1.3 -f gbbct1.seq
$

你可以看到,当我启动 program2 时,我已经让 dribbler 运行了一段时间(它被修改并重新编译 - 我懊恼的一部分),所以有有相当多的日期需要立即读取(因此多行带有时间戳 2017-06-03 23:52:44.836:),但随后它正在等待 dribbler写更多,正如你所看到的,有时每行之间等待近 6 秒,有时大约 1 秒,以及之间的各种间隔。 program2 每次休眠一秒钟,从而使间隙变得更加均匀。 (是的,我编写这些工具是为了帮助回答有关 SO 的问题 - 但 dribbler 和 tstamp 都比这个问题早了几个月。)

关于c - 从正在主动写入的文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44351168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com