急急!Linux 命令框里 将文件导入程序的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急急!Linux 命令框里 将文件导入程序的问题相关的知识,希望对你有一定的参考价值。

注意这个是Linux的cmd
如果有一个play.c的文件,首先我编译它
>> gcc play.c
编译成功
然后我输入以下命令将一个test.txt的文件导入
>>./a.out < test.txt
我在play.c里用了argv字符串, 部分代码如下:
int main (int argc, char *argv[])

FILE* stream;

if ( (stream = fopen( argv[2] , "r" ) ) == 0 )

printf ("File open failed\n");
exit(1);

.........
return 0;

然后执行出来的结果就是 File open failed
请教达人这为什么打不开啊?
如果我用了指令./a.out < test.txt后,要在程序里读入test.txt里面的东西怎么办??
我不要类似“删掉导入符就可以了”的答案啊。。。

我实验了下, <和>这两个个符号,没有作为单独的参数处理,因为在作为参数传递给程序之前,已经提前被shell给解析并替换了。

简单的例子:

#include <stdio.h>
#include <stdlib.h>

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

printf("arguement0=%s\narguement1=%s\narguement2=%s\n",
argv[0],argv[1],argv[2]);
FILE *stream;
if((stream = fopen(argv[2],"r")) == NULL )

perror("cannot open file...\n");
exit(-1);


fclose(stream);
return 0;


然后执行,结果相当奇怪:
[ksl@myhost ~]$ ./a.out < test2.c
arguement0=./a.out
arguement1=(null)
arguement2=SAL_USE_VCLPLUGIN=gtk
cannot open file...
: No such file or directory

再次执行:

[ksl@myhost ~]$ ./a.out > test2.c
cannot open file...
: No such file or directory

我觉得a.out的输出肯定是被定向到test2.c里面去了。。。再次验证:

[ksl@myhost ~]$ cat test2.c
arguement0=./a.out
arguement1=(null)
arguement2=SAL_USE_VCLPLUGIN=gtk

果然...所以这个是和shell的工作有关的...

不过,我们还有办法...利用这一点..刚才查了下
这里有说明http://blog.daviesliu.net/2005/08/31/200811/
,说>和<这两个符号把把stdin和stdout定向到了参数提供的文件...
不过,那不就更省事了,我们还不用打开文件了,直接读取stdin和stdout不就得了 ...

程序修改成这样:

#include <stdio.h>
#include <stdlib.h>

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

char buf[128];

char *p=NULL;
while((p=fgets(buf,64,stdin))!=NULL) //打印下文件,看有效果没....
printf("%s",p);

return 0;


编译,换个文件再试试,就试试这个test.c吧:

[ksl@myhost ~]$ ./a.out < test.c
#include <stdio.h>
#include <stdlib.h>

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

char buf[128];

char *p=NULL;
while((p=fgets(buf,64,stdin))!=NULL)
printf("%s",p);

return 0;


so,搞定..... 顺便重温了下重定向...呵呵
参考技术A 把 < 去掉,也就是 ./a.out test.txt
你用 <相当于输入的重定向,把test.txt的内容当成文件名了,当然不存在这样的一个文件追问

去掉 < 的我会用,现在的问题是必须用 < 这个而且应该是没错的,我不知道是不是除了argv以外还有另外的方法?

追答

你要先理解是输出的重定向,相当于把你printf出来的东西重定向到某个文件。

Linux高手请进,急急急!Linux脚本,与二进制程序的异同

什么是Linux脚本?什么是二进制程序?这两者有何异同? 急急!恳请高手赐教!

参考技术A linux脚本基于Shell,是一将Shell命令放在一个文件中,然后让Shell读取并执行这个文件,可以将这个功能看作是一种shell程序,而Shell命令就像是这个程序里的语句,包含Shell命令的文件叫做Shell脚本。可以说SHELL语言既是命令又是一种编程语言。
根据使用的shell的不同,Shell脚本编写也有细微的区别。
Linux二进制可执行文件,指的是将程序,如各种编程语言所编写的程序,甚至SHELL脚本进行编译,解释后,整理的二进制可执行文件。可以作为机器工作的直接语言。可以认为他是用来直接命令下层硬件的。
主要区别是:Shell脚本具有可读性好,改写方便。而二进制程序要改动只能改变源代码,重新编译。
你可以理解成Shell脚本像C++那类的编程语言,二进制程序类似于.exe可执行文件就行了。
不过shell和C++不一样。他首先是一种命令,他具有一定的编程功能,但并不能与编程语言想比。
再次,他与DOS命令行很像,但是却比DOS命令行更强大。

以上是关于急急!Linux 命令框里 将文件导入程序的问题的主要内容,如果未能解决你的问题,请参考以下文章

无法创建目录或文件?急急急啊!!

linux打开文件后怎么保存关闭,急急急!!!(在命令行里)

linux下上网问题,急急急

无法安装软件 错误提示:无法创建目录和文件!急急!!

matlab蚁群算法中数据怎么导入???急急急

急急急!linux下安装MySQL的问题?