我正在寻找从 stdin
读取数据的最佳方式C 编程中的管道。
问题:我需要寻找这些数据,即在同一流的末尾读取一些数据后,我需要从流的开头读取数据。
小用例:gunzip -c 4GbDataFile.gz | myprogram
另一个 :
nc -l -p 1234 | myprogram
gunzip -c 4GbDataFile.gz | nc -q 0 theotherhost 1234
我知道从 fifo 读取只能完成一次。所以,目前:
stdin
内存并从这个分配的内存中工作。 这很丑陋,但它有效。一个明显的问题是,如果有人向我的应用程序发送一个巨大的(或连续的)流,我将以分配的大内存块结束,否则我将耗尽内存。 (考虑一个 8Gb 的文件)
我接下来的想法:
但是,这有什么意义呢?我无法找出我正在阅读的数据的来源。如果这是一个本地 8Gb 文件,我会将其转储到同一系统上的另一个 8Gb 文件中。
所以,我的问题是:
How do you read efficiently a lot of data from an
stdin
pipe when you have to seek back and forth in it?
提前感谢您的回答。
编辑 :
我的程序需要在给定文件的某处(取决于文件格式)读取元数据,因此可能在流的末尾。然后它可能会在流的开头读回其他数据,然后在另一个地方等。简而言之:它需要访问数据的任何字节。
例如,在从
stdin
开始读取之前,在不知道文件格式的情况下读取存档文件的数据。 :我需要检查存档元数据,查找存档文件名和偏移量等。因此,我将制作标准输入内容的本地副本并从中工作。感谢大家的投入;)
最佳答案
你需要明确你的要求。如果您需要寻求() 那么显然你不能从 获取输入标准输入 .如果您需要寻求() 那么您应该将输入文件名作为参数。
关于c - 如何从需要查找的标准输入管道数据中高效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10481093/