如何在不指定argc的情况下在C++中读取单个.txt文件作为输入

How to read a single .txt file as input in C++ without specifying argc

本文关键字:txt 单个 文件 读取 输入 情况下 argc C++      更新时间:2023-10-16

我正在尝试创建一个在单个.txt文件中读取的程序。问题是,我熟悉的唯一方法是使用

int main ( int argc, char *argv[] ).

然而,我的所有输入始终只接受一个文件,所以我想让用户每次运行程序时都指定argc=2是多余的。有没有一种方法可以让C++隐式地知道只有一个命令行参数?

argc变量包含调用程序时使用的实际参数数。当您输入main功能时,它会自动设置。你不能说这个数字是多少,也不能由运行程序的用户手动设置。

如果你想让你的程序只运行特定数量的参数(在你的情况下是一个参数),你必须在main函数中执行检查:

if (argc != 2)
{
    std::cerr << "Invalid number of arguments" << std::endl;
    return 1;
}

除了ips的其他答案外,您还应该记住,C99(或C11)标准语言的任何托管环境都会以特定于实现的方式为main提供参数int argcchar**argv

在DOS和Windows上,有传言称操作系统的命令行接口正在将命令行解析为main的参数。

在POSIX系统和Linux上,指定每个程序通过POSIX exec函数启动,对于Linux,该函数转换为execve(2)系统调用。在这样的系统上,shell将命令扩展为一组参数(对于execve),因此可能会执行一些globbing操作:请参见glob(7)。但该程序从一个初始堆栈开始,该堆栈包含(特别是)main的参数。详细信息是特定于ABI的,对于x86-64上的Linux,请阅读x86-64 ABI规范

您可以保证argc大于0,argv的所有第一个argc元素都是以null结尾的字符串,并且不是指针别名,并且argv[argc]NULL指针。因此,如果您只想要一个程序参数,您应该测试argc==2,并使用argv[argc]作为程序参数。

在实践中,您应该始终测试argcargv。GNUglibc提供了两种解析程序参数的方法:通常的getopt和argp。

GNU编码标准规定每个程序至少应接受--help--version程序参数。我讨厌不遵守规则的程序,所以请遵守它…

BTW用于处理文本文件的程序(例如cat(1)…),通常将每个程序参数(不是以-开头的某个选项)处理为文件路径,因此您的程序可能会在argv数组的组件上循环(在秩0的第一个之后,这通常是程序名称)。