C++ 输入重定向在文件参数工作时导致错误
C++ input redirection causing error while file arguments work
当我将输入文件指定为文件参数时,如下所示:
./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
来了解传递的参数数量,并根据参数数量使用文件或标准输入。
当我将输入文件指定为文件参数时,如下所示:
./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
来了解传递的参数数量,并根据参数数量使用文件或标准输入。