将 linux 中标准输入的文件名通过管道传输到 C++

Piping filename from standard input in linux into c++

我希望能够在终端(如下所示)中编写一行,将同一目录中的文本文件输入到可执行文件中。

cat fileName | executable

我希望能够将文件名读入 C++ 代码。我已经有了访问行和读取文件的代码,它只是从标准输入接收文件名。

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

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

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

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

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

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

为了适应 "pipe the name" 或 "use 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) ) {
      ...

你实际上不清楚,如果你想从 std::cin 读取文件,因为它是由

提供的
cat filename | executable

或者如果您实际上从 std::cin.

获得要打开的文件名

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