如何在执行C程序时传递文件名
我试图在我的C程序中不硬编码输入文件的名称。当我硬编码文件名时,所有其他组件都在工作。但希望能够传递一个字符串文件名。 我试图执行一个名为如何在执行C程序时传递文件名,c,bash,terminal,arguments,command-line-arguments,C,Bash,Terminal,Arguments,Command Line Arguments,我试图在我的C程序中不硬编码输入文件的名称。当我硬编码文件名时,所有其他组件都在工作。但希望能够传递一个字符串文件名。 我试图执行一个名为Matrix.c的文件,并将其可执行文件命名为Matrix 所以,在终端中,当我到达我的工作目录时 gcc -g Matrix.c -o matrix 然后当我编译 ./matrix 它没有一个文件名传递给它,所以我要检查它,让用户输入一个文件名来加载 但是,当有人传递文件名时,是否应将其传递为: ./matrix filename.txt 或 /ma
Matrix.c
的文件,并将其可执行文件命名为Matrix
所以,在终端中,当我到达我的工作目录时
gcc -g Matrix.c -o matrix
然后当我编译
./matrix
它没有一个文件名传递给它,所以我要检查它,让用户输入一个文件名来加载
但是,当有人传递文件名时,是否应将其传递为:
./matrix filename.txt
或
/matrix
使用后一个选项,我似乎无法从argv[1]
获取传递给函数的参数名称-它只是“(Null)”
我知道这是一个非常简单的问题。但我是不是完全疯了?这和我在OSX El Capitan上运行有关吗。我知道我在argv[1..argc-1]中使用了命令的“参数
argv[1..argc-1]中有从“参数重定向到命令的命令
从'重定向的问题主要是shell如何工作。使用时:
./matrix filename.txt
./matrix < filename.txt
然后给程序两个参数——程序名和文件名。使用时:
./matrix filename.txt
./matrix < filename.txt
/matrix
然后只给程序一个参数——程序名,shell安排它的标准输入来自文件(文件名不会传递给程序)
任何一种都可以发挥作用;你只需要决定你要支持哪一个。如果用户键入
/matrix file1.txt file2.txt file3.txt
,会发生什么情况?传统行为的一个版本是依次处理每个文件,将每组结果写入标准输出。有很多替代行为——其中大多数都曾被某个人在某个时候使用过。在没有指定文件名的情况下读取标准输入是一种常见的操作模式(想想cat
和grep
和…。问题主要是shell如何工作。使用时:
./matrix filename.txt
./matrix < filename.txt
然后给程序两个参数——程序名和文件名。使用时:
./matrix filename.txt
./matrix < filename.txt
/matrix
然后只给程序一个参数——程序名,shell安排它的标准输入来自文件(文件名不会传递给程序)
任何一种都可以发挥作用;你只需要决定你要支持哪一个。如果用户键入
/matrix file1.txt file2.txt file3.txt
,会发生什么情况?传统行为的一个版本是依次处理每个文件,将每组结果写入标准输出。有很多替代行为——其中大多数都曾被某个人在某个时候使用过。在没有指定文件名的情况下从标准输入读取是一种常见的操作模式(想想cat
和grep
和…。我环顾四周,发现有很多不同的解决方案和不同的处理方法。你能给我们看一下matrix.c
的代码吗?使用时使用重定向将输入从文件名重定向到程序。欢迎使用堆栈溢出。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请看这一页,我也四处看看,有很多不同的解决方案和不同的处理方法。你能给我们看看matrix.c
的代码吗?使用时使用重定向将输入从文件名重定向到程序。欢迎使用堆栈溢出。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请看这一页,也谢谢你的澄清。我刚刚修复了它,并尝试解决所有三种输入模式。ThanksI经常使用类似于int processor(FILE*fp,const char*fn)
的函数,该函数从流fp
读取输入,流是打开的文件fn
(或“标准输入”的伪名称),有时使用额外的参数FILE*ofp
来指定输出应该写入哪个文件。“成功”的返回值为0,失败的返回值为其他任何值。然后,主程序中的代码可以很容易地调用processor()
。实际上,我有一组函数处理零个或多个剩余参数的处理,因此main()
结束返回过滤器(argc、argv、optind、processor)
isatty()
在这里可能很有用,请参见感谢您的澄清。我刚刚修复了它,并尝试解决所有三种输入模式。ThanksI经常使用类似于int processor(FILE*fp,const char*fn)
的函数,该函数从流fp
读取输入,流是打开的文件fn
(或“标准输入”的伪名称),有时使用额外的参数FILE*ofp
来指定输出应该写入哪个文件。“成功”的返回值为0,失败的返回值为其他任何值。然后,主程序中的代码可以很容易地调用processor()
。实际上,我有一组函数处理零个或多个剩余参数的处理,因此main()
结束返回过滤器(argc、argv、optind、processor)
isatty()
在这里可能很有用,请参见感谢您的澄清。我刚把它修好,试了试t