【问题标题】:Sending text file name from command line c++从命令行 C++ 发送文本文件名
【发布时间】:2018-11-06 08:16:38
【问题描述】:

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

  1. myprogram < input.txtcat input.txt | myprogram
  2. myprogram input.txt

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

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

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

【问题讨论】:

  • 您的意思是要在代码中使用管道运算符吗?或者您是否在询问如何使用 > 运算符写入 input.txt? Do note that > is a special character
  • 你的意思是myprogram < input.txtmyprogram input.txt。使用myprogram > input.txt 写入input.txt
  • 是我的程序
  • input.txt 的内容 - 添加 Veronica 添加 Sam 删除 Sam。我正在处理每个单词并进一步验证它
  • 你有两个选择,一个非便携式 Linux 解决方案是在没有给出参数的情况下打开"/dev/stdin"。一个可移植的解决方案需要将std::cin 作为istream 引用传递并在没有给出参数的情况下在函数中读取。

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


【解决方案1】:

如评论中所述,一种可移植的方式是将打开的文件或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

【讨论】:

  • 明白了!非常感谢
  • 很好,很高兴它有帮助。祝你编码顺利。
  • @KumudaAggarwal 您应该将原始问题更改为 myprogram &lt; input.txt,然后接受 Davids 的回答。
【解决方案2】:

你想从标准输入读取,有两个选项:

  • std::cin
  • fread() 和其他 C 风格的 IO

std::cin &gt;&gt;https://en.cppreference.com/w/cpp/io/cin 的优点是可以将格式化文本读入某种二进制表示https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt

C风格的IOhttps://en.cppreference.com/w/cpp/io/c的优点是可以很好的读取二进制数据。

这取决于你想用你的输入做什么

【讨论】:

  • 在其他块 { cin>> s; fin.open(s) }
  • 你是这个意思吗?
  • 所以stdin已经是一个文件了,所以你不需要打开它,你可以从中读取。基本上有两种方法可以做到这一点。 c++方式是使用std::cin的流操作符(&gt;&gt;)或者使用c的fread(和fetgsfgetc等)使用stdin(无命名空间)宏作为 FILE * 参数
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 2012-08-26
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
相关资源
最近更新 更多