【问题标题】:Pipe a file of bytes to C++program, via Linux and read byte-by-byte?通过Linux将字节文件传输到C++程序并逐字节读取?
【发布时间】:2013-10-16 20:50:16
【问题描述】:

有没有办法将(显然是字节)文件通过管道传输到 Linux 上的 C++ 应用程序。但是,我不想只使用getline(),而是只想读取每个字节一次。例如,我不想使用getline(),因为它会读取直到'\n'的所有字节,然后我还必须重新读取通过getline()给我的字节,所以字节是读了两遍。我只想“迭代”每个字节一次。

什么是性能最好的技术,一次读取 PAGE_SIZE 个字节?欢迎提供任何示例代码!

【问题讨论】:

  • 我不明白字节在哪里被读取了两次......
  • @OliCharlesworth 当您调用 getLine() 时,字节将被遍历一次(否则它如何知道 '\n' 在哪里),然后我将再次遍历字节应用我的应用程序逻辑。
  • @H2CO3 fgetc() 与下面的 read() 建议相比如何?
  • @user997112 几乎完全相同。

标签: c++ linux pipe cin


【解决方案1】:

不要忘记std::cinstd::istream 类型。您可以使用标准的get() 一次检索char

char nextVal = std::cin.get();

要一次读取PAGE_SIZE 字节,请改用read()

char *buffer = new char[PAGE_SIZE];
std::cin.read(buffer, PAGE_SIZE);

请记住在阅读后始终检查错误条件和 EOF。

【讨论】:

  • 但是,这是手动实现 Linux 内存映射文件实现的功能。因此,如果性能是一个问题,那可能是更好的方法。
  • 谢谢你——你同意一次读取 PAGE_SIZE 个字节是最有效的吗?是否有一种“简洁”的方式来处理最后一次读取(不一定会剩余 PAGE_SIZE 个字节)?
  • @OliCharlesworth 同意,但有人告诉我输入需要从(大概)终端“管道”输入到应用程序中。
  • 是的,它更高效,因为它转换为单个系统调用来读取,而不是 PAGE_SIZE 单独的。要处理最后一次读取,您可以使用readsome() 而不是read():它返回实际存储在数组中的字节数:在最后一次调用时,它将小于PAGE_SIZE
  • 关于这里的另一个答案的任何回应,说 read() 会引入另一个缓冲区?
猜你喜欢
  • 2015-10-23
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 2013-12-06
相关资源
最近更新 更多