c - 如何从需要查找的标准输入管道数据中高效读取

标签 c file memory stdin

我正在寻找从 stdin 读取数据的最佳方式C 编程中的管道。

问题:我需要寻找这些数据,即在同一流的末尾读取一些数据后,我需要从流的开头读取数据。

小用例:gunzip -c 4GbDataFile.gz | myprogram
另一个 :

  • 在本地主机上:nc -l -p 1234 | myprogram
  • 在远程主机上:gunzip -c 4GbDataFile.gz | nc -q 0 theotherhost 1234

  • 我知道从 fifo 读取只能完成一次。所以,目前:
  • 啜饮一切来自 stdin 内存并从这个分配的内存中工作。

  • 这很丑陋,但它有效。一个明显的问题是,如果有人向我的应用程序发送一个巨大的(或连续的)流,我将以分配的大内存块结束,否则我将耗尽内存。 (考虑一个 8Gb 的文件)

    我接下来的想法:
  • 我设置了 大小限制 (可能是用户定义的)该内存块。一旦我从 stdin 读取了这么多数据:
  • 要么我停在这里: “呃。记不住了,bazinga。算了吧。” 风格。
  • 要么我开始倾倒我在读什么到文件 并在读取所有数据后从此文件中工作。

  • 但是,这有什么意义呢?我无法找出我正在阅读的数据的来源。如果这是一个本地 8Gb 文件,我会将其转储到同一系统上的另一个 8Gb 文件中。

    所以,我的问题是:

    How do you read efficiently a lot of data from an stdinpipe when you have to seek back and forth in it?



    提前感谢您的回答。

    编辑 :

    我的程序需要在给定文件的某处(取决于文件格式)读取元数据,因此可能在流的末尾。然后它可能会在流的开头读回其他数据,然后在另一个地方等。简而言之:它需要访问数据的任何字节。

    例如,在从 stdin 开始读取之前,在不知道文件格式的情况下读取存档文件的数据。 :我需要检查存档元数据,查找存档文件名和偏移量等。

    因此,我将制作标准输入内容的本地副本并从中工作。感谢大家的投入;)

    最佳答案

    你需要明确你的要求。如果您需要寻求() 那么显然你不能从 获取输入标准输入 .如果您需要寻求() 那么您应该将输入文件名作为参数。

    关于c - 如何从需要查找的标准输入管道数据中高效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10481093/

    相关文章:

    c - 将有符号的 char 数组传递给需要 const char 指针的函数会导致数组值出现乱码

    php - 如何理解3行c代码?

    c - 如何正确调试 Windows 内核驱动程序?

    java - 将 Java StringBuilder 转储到文件

    c - 从堆动态分配内存

    c - C : stack or global variable? 中的 RAM 优化

    c - 一个 C 程序读取两个文件并在屏幕上显示它们的统计信息

    objective-c - iPhone/Objective-C : Can't delete a file

    python - 为什么在 Python 中从多个进程写入文件时我的文件没有损坏?

    java - 空闲 Java 进程上的 RSS 内存不断增长