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
来了解传递的参数数,并根据参数数使用文件或 stdin。
相关文章:
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 如何定义在用作函数参数时工作的类模板的转换
- C++20字符串文本模板参数工作示例
- C++中的可变参数模板及其工作原理
- std::bind,无法让具有单个参数的方法工作
- 隐式转换是否应该在模板参数的上下文中工作?
- 我不明白参数和参数如何协同工作
- 通过参数启用时,std::enabled_if 如何工作
- 当传递NULL作为参数时,函数重载是如何工作的
- GoogleTest 中的参数化测试无法按预期工作
- 此函数如何在不传递任何参数的情况下工作?
- 我的代码在作为参数传入 .begin() 时不起作用,但在我将 .begin() 转换为迭代器后工作
- C++11: 如何编写一个像 Get 一样工作的模板函数<tuple>...但是收到参数包?
- 参数传递和返回值如何在程序集级别的 x86 上的 C/C++ 中工作?
- 我可以更改将引用参数传递到指针中并使其正常工作的函数的输入(C、C++)吗?
- 工作函数重载如何使用可变参数解析?
- 宏参数的扩展如何在 c++ 中工作
- 'const std::string&s = nullptr' 如何作为可选参数工作
- C++输入重定向导致文件参数工作时出错
- 获取浮点模板参数工作编译的"hack",但在 g++ 和 clang 上都存在段错误