【问题标题】:using piped input of a file, not able to get the file name piped to it instead of the file content使用文件的管道输入,无法通过管道获取文件名而不是文件内容
【发布时间】:2019-02-23 15:00:08
【问题描述】:

我将使用管道传递一个文本文件。

cat ./file.txt | ./pargrep word

我试图获取文件名

fgets(buf, NULL, stdin);

我怎样才能只得到文件名而不是文件内容,我在使用gets时得到。我需要阅读该文件,该文件非常大,需要阅读两次。

【问题讨论】:

  • 如果您查看cat ./file.txt 的输出,您如何知道文件名?您的程序会获得相同的信息,并且能够使用您使用的相同方法。如果文件名在那里不可见,那么您可以使其可见,例如首先管道文件名,然后是内容。
  • @Yunnosch 我如何在程序中通过管道获取文件名。
  • 也许像echo ./file.txt | ./pargrep word 这么简单?管道名称和内容需要一些命令行语法魔法,或者可能更简单,一个简短的脚本。
  • 我认为在管道输入的情况下您可能不需要文件名。你能仔细检查一下课堂作业真的需要吗?我问是因为查找文件名的具体工作(如果你只得到问题中所示的命令行并且你只能影响 pargrep 的实现)实际上可能是不可能的。我会乐观地假设你的老师没有设定不可能完成的任务......
  • 任务是直接从文件中获取内容,文件是一个大文件,需要grep查找文件中的一个单词并打印出来,就像grep一样,但需要通过线程来实现。我将整个文件存储在一个字符串数组中。在存储它之前,我必须检查其中的行数,然后开始存储它,所以我去读取文件两次。标准输入不允许我阅读两次。所以,我打算获取文件名。关于如何解决的任何线索?

标签: c file input pipe stdin


【解决方案1】:

我不会使用管道。我假设您正在编写程序 ./pargrep?我会将您要处理的文件的名称作为第一个参数传递给您的 pargrep 程序。然后第二个参数将是“单词”

然后您将在程序中按名称打开文件。

【讨论】:

  • 这是一个班级作业,我必须同时处理来自文件的输入和管道输入。有没有办法处理管道输入以获取文件名
  • Roger 是正确的,您的 pargrep 应用程序无法确定 cat(ted) 到管道的文件的名称。由于您需要读取该文件两次,您可以考虑将您从 STDIN 读取的内容写入一个临时文件,然后再次打开它,以便您可以再次读取它。
【解决方案2】:

问题是cat 输出文件的内容。如果你想要文件名,运行为

echo ./file.txt | ./pargrep word

但最好使用 dernst 建议而不是这个

【讨论】:

  • 这是一个班级作业,我必须同时处理来自文件的输入和管道输入。有没有办法处理管道输入以获取文件名
  • @Roger 如果您通过管道输出cat,则不会。作业是否可能希望您将文件名作为参数(如 dernst 所说),或直接从标准输入获取内容(包括来自cat 的管道)
  • 任务是直接从文件中获取内容,文件是一个大文件,需要grep查找文件中的一个单词并打印出来,就像grep一样,但需要通过线程来实现。我将整个文件存储在一个字符串数组中。在存储它之前,我必须检查其中的行数,然后开始存储它,所以我去读取文件两次。标准输入不允许我阅读两次。关于如何解决的任何线索?
  • @Roger,先将所有数据保存到缓冲区中,然后您可以随意查看多次。
  • 将数据保存在缓冲区然后保存到指针会导致额外的开销,我们根据实际 grep 和多线程 grep 之间的速度比较来获得分数。看起来这是唯一的方法。谢谢你的时间
猜你喜欢
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 2021-10-15
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多