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

标签 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

最佳答案

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

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

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

关于c++ - C++输入重定向在文件参数工作时导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55821391/

相关文章:

python - 在 fileinput 模块中结合就地过滤和编码设置

javascript - 使用 node.js 扫描/跟踪许多文件并跳过已处理的文件

c++ - 根据字符串访问类成员

c++ - 填充 unordered_set 太慢

使用 SWIG 对 C++ 进行 Python 包装。参数类型无法识别

c# - File.Copy() 到具有网络凭据的文件服务器

error-handling - 什么是 502 BAD GATEWAY nginx/1.4.6(Ubuntu)

asp.net-core - UseStatusCodePagesWithReExecute的用法,其消息未按预期工作

php - Yii2 在控制台模式下捕获异常

c++ - std::list iterator.erase() 导致无效指针