C ++输入重定向在文件参数工作时导致错误

时间:2019-04-24 02:07:29

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

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

./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,因为它对程序的其余部分非常有帮助。

此外,如果未提供文件参数,则程序应直接在stdin上接受输入。当前,如果未提供文件参数,它将引发相同的错误,而不是寻找用户输入。

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

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

仅打印./asm

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

./asm ex1_in my1_out

1 个答案:

答案 0 :(得分:1)

您正在尝试每次打开文件argv[1]

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

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