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

时间:2014-11-12 19:45:52

标签: c++

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

这样做的唯一方法
int main ( int argc, char *argv[] ).

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

2 个答案:

答案 0 :(得分:3)

argc变量包含所调用程序的实际参数数。输入main功能时会自动设置。你不能说这个号码是什么,也不能由运行该程序的用户手动设置。

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

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

答案 1 :(得分:2)

除了other answer by ips之外,您应该记住,C99(或C11)标准语言的任何托管环境都会为int argcchar**argv提供mainmain {1}}以特定于实现的方式。

在DOS和Windows上,据传操作系统的命令行界面正在将命令行解析为execve的参数。

在POSIX系统和Linux上,指定每个程序从POSIX exec functions开始,用于Linux转换为execve(2)系统调用。在这样的系统上,shell正在将命令扩展为参数数组 - main - 所以可以做一些globbing:见glob(7)。但是程序从一个包含(特别是)argc的参数的初始堆栈开始。详细信息为ABI,对于Linux on x86-64,请阅读x86-64 ABI spec

我们保证argc是> 0,argv的所有argv[argc]个元素都是以空字符结尾的字符串而不是指针别名,NULLargc==2指针。因此,如果您只想要一个程序参数,那么您应该测试argv[argc],并且应该使用argc作为程序参数。

在实践中,您应该始终测试argv--helpGNU glibc提供了两种解析program arguments的方法:通常的getoptargp

GNU coding standard指定每个程序至少应接受--version-程序参数。我讨厌不遵守该规则的节目,所以请关注它......

BTW,对于处理文本文件的程序(例如cat(1) ...),习惯上将每个程序参数(不是以argv开头的选项)作为文件路径处理,所以你的程序应该循环{{1}}数组的组件(排在第0位之后,通常是程序名)。