【问题标题】:Piping filename from standard input in linux into c++将文件名从linux中的标准输入管道传输到c ++
【发布时间】:2015-07-22 18:33:25
【问题描述】:

我希望能够在终端(如下所示)中编写一行,该终端在同一目录中获取一个文本文件并将其名称输入到可执行文件中。

cat fileName | executable

我希望能够将文件名读入 C++ 代码。我已经有一个代码可以访问这些行并读取文件,它只是从标准输入接收 fileName 。

是否有一行代码或函数将文件名读入 c++ 程序并将其存储为字符串?我目前正在使用下面的代码来阅读文本文件的每一行。

ifstream myfile; 
myfile.open(fileName.c_str());

if( myfile.is_open() )
{   
    while ( getline (myfile ,line) )
    {
                  ......
    }
}

【问题讨论】:

  • 只是从标准输入中读取,这就是| 管道数据的地方。
  • 只是为了记录,将文件名放在命令行上更正常。然后,您的程序甚至可以在包含换行符的文件名上运行。 (是的,这是可能的。不,这不常见也不是一个好主意。)但是你可以说./myprog *.c)。有些程序确实有从标准输入读取文件名的选项,用于find ... | myprog,但你总是可以find ... -exec myprog {} +,现在find 具有用于exec 的+ 功能。总是有... | xargs -d'\n' myprog

标签: c++ linux pipe cat


【解决方案1】:

当您执行cat filename | executable 时,您发送的不是文件名,而是其内容。如果您想发送姓名,请使用echo filename | executableexecutable filename。然后您可以像往常一样处理argcargv,并读取您在示例代码中显示的正常文件。

【讨论】:

  • 非常感谢!我是 Linux 和 C++ 的新手,所以我不知道回显代码。效果非常好。
  • 在 Stackoverflow 上说“谢谢”的方式是按向上的三角形。您还应该通过单击复选标记将其中一个答案标记为正确。
【解决方案2】:

你需要做的就是从标准输入读入一个变量(例如“fname”):

int main () {
  string fname;
  cin >> fname
  ifstream myfile;
  myfile.open (fname);
  if (myfile.is_open() ) {   
    while ( getline (myfile, line) ) {
      ...

为了适应任一“管道名称”或“使用 argc/argv”(就像许多 *nix 命令所做的那样):

int main (int argc, char *argv[]) {
  string fname;
  if (argc == 1) {
    cin >> fname
  }
  else {
    fname = argv[1];
  }
  ifstream myfile;
  myfile.open (fname);
  if (myfile.is_open() ) {   
    while ( getline (myfile, line) ) {
      ...

【讨论】:

  • 感谢您的帮助!它比我尝试做的大多数事情要简单得多。
  • 您会使用 linux 终端中的哪种类型的命令行来通过管道传输文件名?我一直在尝试使用“cat filename | program”,但它似乎无法正确读取文件。
  • 不,你想要echo filename。 "cat" 打印文件的内容。 "echo" 打印字符串 "f-i-l-e-n-a-m-e"。
【解决方案3】:

您实际上并不清楚,如果您想从 std::cin 读取文件,因为它将由提供

cat filename | executable

或者,如果您实际上从std::cin 获取要打开的文件名。

您很可能希望有一个可选的命令行参数(传递给int main(int argc, char* argv[])),并让您的阅读代码依赖于std::istream 输入源,而不是std::cinstd::ifstream 硬编码。

【讨论】:

  • istream 与 ifstream 有何不同?我用来读取文件的方法是否必须改变?
  • 不同之处在于,您可以透明地使用对std::cinstd::ifstream 的引用,而无需关心流实际上是如何实例化的。
猜你喜欢
  • 2014-02-22
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 2019-05-17
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多