【问题标题】:C++ input redirection causing error while file arguments workC++ 输入重定向导致错误,而文件参数工作
【发布时间】:2019-04-24 02:07:28
【问题描述】:

当我将输入文件指定为文件参数时,如下所示:

./asm ex1_in

一切正常!

但是,当我使用重定向指定输入文件时,如下所示:

./asm < ex1_in

当输入文件损坏或不存在时,程序会抛出它应该抛出的错误。

这是处理输入和文件参数的代码部分:

int main(int argc, char * argv []) {
    ifstream InFile(argv[1], ios::in); 

    if (!(InFile.is_open())) {  /* check file */
        fprintf (stderr, "The input file cannot be open or cannot be read. \n");
        return 2;
    }                

    if (InFile.is_open()) {
        //some stuff
        InFile.close();     
    }   

    //other stuff
}

我希望能够继续使用 ifstream,因为它对程序的其余部分非常有帮助。

此外,如果没有提供文件参数,程序应该直接在标准输入上接受输入。目前,如果没有提供文件参数,它会抛出相同的错误,而不是寻找用户输入。

编辑:我在main 中添加了一行以尝试查看发生了什么,并且看起来当使用输入重定向时,程序看不到 argv[1] 或之后的任何内容。

cout << argv[0] << " " << argv[1] << " " << argv[2];

只打印出./asm

当不使用输入重定向时,它会打印出:

./asm ex1_in my1_out

【问题讨论】:

    标签: c++ file-io error-handling command-line-arguments ifstream


    【解决方案1】:

    每次运行程序时,您都试图将argv[1] 作为文件打开。

    在第一种情况下,argv 的长度为两个(可执行文件名和文件名),因此它会打开并执行正常需要执行的操作,但是当您运行它时会将文件重定向到标准输入,@987654325 @ 只包含可执行文件的名称,由于 argv[1] 是 C 风格的字符串,它会读取所有内容,直到找到一个空字节,然后将读取的所有内容传递给 std::ifstream 构造函数,每次都失败。

    您应该使用argc 来了解传递的参数数量,并根据参数数量使用文件或标准输入。

    【讨论】:

    • 谢谢!如何将我的 ifstream 设置为 cin?我试过:if (argc == 1) { ifstream InFile(cin, ios::in); } 但这给了我一个错误。
    • 似乎有很多方法可以做到这一点,看看This quetionthis other question
    猜你喜欢
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2013-07-12
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多