2016-09-25 59 views
0

我想在我的C程序中不输入输入文件的名称。当我对文件名进行硬编码时,所有其他组件都能正常工作。但希望能够传递一个字符串文件名。 我正在尝试编译一个名为Matrix.c的文件并将其可执行文件命名为matrix如何在执行C程序时传递文件名

因此,在终端中,当我到达我的工作目录。

gcc -g Matrix.c -o matrix 

然后当我编译

./matrix 

它没有传递给它一个文件名,所以我对于要去检查,并让用户输入一个文件名来加载。

然而,当有人通过文件名,是否应该通过为:

./matrix filename.txt 

./matrix < filename.txt 

对于后者的选择,我似乎无法得到参数的名称从argv[1]传递给函数 - 它只是“(空)”。

我知道这是非常简单的问题。但是我完全摆脱了摇杆吗?这与我在OS X El Capitan上运行有什么关系。我知道我以前使用'<'的惯例。

+0

我环顾四周,有很多不同的解决方案和不同的方法来处理它。 – WallofKron

+0

你能向我们展示'matrix.c'的代码吗?使用'<'重定向不需要任何额外的参数,但是您使用'scanf','gets'读取'stdin',无论您是否使用标准输入。 –

+0

当您使用<您将输入从您的文件名重定向到您的程序。 –

回答

0

命令的参数在argv [1 .. argc-1]中。

'<'的重定向将文件的内容发送到程序的stdin。

获取文件名的第三种方法是打印“输入文件名:”,然后读取用户键入的字符串。

+0

谢谢你清理那个。我只是修正了它,并试图解决所有三种输入模式。谢谢 – WallofKron

4

问题主要在于shell如何工作。当你使用:

./matrix filename.txt 

然后该程序给出两个参数 - 程序名和文件名。当您使用:

./matrix < filename.txt 

然后该程序只给定一个参数 - 程序名 - 与外壳安排它的标准输入来自文件(文件名不传递给你的程序)。

可以使其工作;你只需要决定你想要支持。如果用户输入./matrix file1.txt file2.txt file3.txt,会发生什么?传统行为的一个版本是依次处理每个文件,将每组结果写入标准输出。有很多其他行为 - 其中大多数在某个时间或某个时候被某人使用。当没有指定文件名称时从标准输入读取是一种常见的操作模式(请考虑catgrep和...)。

+0

感谢您解决这个问题。我只是修正了它,并试图解决所有三种输入模式。谢谢 – WallofKron

+0

我经常使用类似'int处理器(FILE * fp,const char * fn)'的函数来读取来自流'fp'的输入,它是打开的文件'fn'(或者是'标准输入的伪名' '),有时使用额外的参数'FILE * ofp'来指定输出应该写入哪个文件。 “成功”返回值为0,其他任何失败。然后,主程序中的代码可以很容易地调用'processor()'。事实上,我有一组处理零个或多个剩余参数的函数,所以'main()'结束'返回过滤器(argc,argv,optind,processor);'。 –

+0

'isatty()'在这里很有用,参见http://stackoverflow.com/questions/1312922/detect-if-stdin-is-a-terminal-or-pipe-in​​-c-c-qt – cdarke

相关问题