c++ 如果我通过命令行将文件重定向到标准输入,为什么我不能从ifstream中按名称读取文件?

tyg4sfes  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(98)

我目前正在我的新Linux笔记本电脑上设置VSCode以使用C++编码。现在我想尝试调试一个文本输入文件。然而,获取文本文件作为程序的参数比我想象的要困难得多。我想让程序像我在终端中输入./program.exe t2.txt一样工作。
我花了2个小时研究如何在VSCode中做到这一点,并发现,我必须与launch.json有关。现在我修改了它,这样至少可以识别一个输入参数(花了2个小时)

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C/C++: g++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": ["1","<","${workspaceFolder}/t2.txt"],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ build active file",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

现在至少我的程序认识到,它得到一个参数作为输入,但我得到的错误,它不是一个文件?基本上,这个runtimeError是在我尝试运行程序时抛出的

std::ifstream file(filename);  // open file
if (not file) {
    throw std::runtime_error("Cannot open file.");
}

我做错了什么?

fnatzsnv

fnatzsnv1#

通过重定向,你可以通过标准的输入流将文件“传递”给你的程序。参见Bash的文档)-而不是通过将文件名作为命令行参数传递给程序(在argv中可以使用)。
命令行参数(argv)和标准输入流(std::cin)是完全不同的东西。
如果你想从argv获取文件名,并且他们打开了一个同名的文件,那么不要使用shell重定向(取出<)。如果您想使用重定向,那么从std::cin(标准输入流)读取文件内容。

相关问题