首页 > 解决方案 > 从命令行 C++ 发送文本文件名

问题描述

我想运行我的代码并以两种方式发送我的文件

  1. myprogram < input.txt或者cat input.txt | myprogram
  2. myprogram input.txt

我已经弄清楚了使用的 secong 方式argcargv[]但我无法弄清楚如何为第一个选项编写代码。

int main (int argc, char *argv[])
{
     ifstream fin;
     if(argc > 1){

        fin.open (argv[1]);
     }
     else
}

标签: c++filec++11command-line

解决方案


如评论中所述,一种可移植的方式是传递打开的文件或std::cin作为istream对函数的引用并在那里进行输入。在这种情况下,文件或std::cin可能会被传递。例如

#include <iostream>
#include <fstream>
#include <string>

void readinfo (std::istream& in)
{
    std::string s;
    while (in >> s)
        std::cout << s << '\n';
}

int main (int argc, char **argv) {

    if (argc > 1) {     /* read from file if given as argument */
        std::ifstream fin (argv[1]);
        if (fin.is_open())
            readinfo (fin);
        else {
            std::cerr << "error: file open failed.\n";
            return 1;
        }
    }
    else {  /* read from stdin */
        readinfo (std::cin);
    }

    return 0;
}

/dev/stdin如果没有给出文件,则仅读取非便携式 Linux 选项只需要三元运算符,例如

    std::ifstream fin (argc > 1 ? argv[1] : "/dev/stdin");
    if (!fin.is_open()) {
        std::cerr << "error: file open failed.\n";
        return 1;
    }
    /* read from fin here */

两者都不是完全优雅的,但都支持(受操作系统约束)

myprogram < input.txt

或者

myprogram input.txt

推荐阅读