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

C++ input redirection causing error while file arguments work

本文关键字:参数 工作 出错 文件 输入 向导 C++      更新时间:2023-10-16

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

./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

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

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

您应该使用argc来了解传递的参数数,并根据参数数使用文件或 stdin。