所以我试图让C程序从命令行读取文件名,格式如下: cat(文件名路径)| (节目名称)
当输入文件作为命令行参数输入时,我可以读取输入文件的名称,但它不会从连接的参数中读取
这是代码,现在它正在读取文件的名称,就像在命令行上写入程序名后一样。
#include <stdio.h>
#include <string.h>
//initialize file pointer
FILE *file;
//initialize global variables
#define DEFAULT_LEN 70
//main
int main(int argv, char *argc[]){
//open File for reading
file = fopen (argc[1],"r");
//test for failure of file open, if failed, print message, quit
if(file == NULL){
printf("I'm sorry Dave, I'm araid I can't do that.\n");
printf("Open the file \"%s\" that is.\n", argc[1]);
return(0);
}
//read the first line of a file into an array
char temp[DEFAULT_LEN]; //where the read data is put
fgets(temp,DEFAULT_LEN,file); //stops at DEFAULT_LEN on \n
//print out temp
printf("%s\n", temp);
//close file, return 0 for main
fclose(file);
return(0);
}
任何帮助将不胜感激
答案 0 :(得分:3)
您的程序无法获取文件名的原因是因为您没有将其提供给它。
如果您将程序运行为:
prog hello.txt
在hello.txt
中给出了argc/argv
参数。
但是,你正在做的是:
cat hello.txt | prog
这意味着 shell 正在打开文件并将其提供给程序的标准输入。实际上,为了更准确,cat
正在打开文件,shell只是将cat
的标准输出连接到prog
的标准输入。
解决这个问题的一种方法是检查参数的数量(argc
通常是计数,argv[]
值,尽管你的代码中有迂回的方式),如果它为零, argc == 1
,从标准输入中读取您的文件。
只有在给出参数时才打开该文件并阅读它。这就是许多UNIX实用程序的工作方式:
od -xcb hello.txt # will dump the file.
cat hello.txt | od -xcb # will dump the file, but using standard input.
echo hello | od -xcb # will dump your "hello" string.
有些人甚至根据他们的调用方式改变他们的行为,wc
是一个例子 - 如果知道文件名,它会显示文件名:
pax> wc -l qq.c
29 qq.c
pax> cat qq.c | wc -l
29
pax> wc -l *.c
0 a b.c
168 binmath.c
49 qq-save.c
29 qq.c
11 qq2.c
5 qqq.c
18 xx.c
280 total
pax> cat *.c | wc -l
280
请注意,最后一种情况 - 因为所有文件都是通过单个标准输入流呈现的,所以无法分辨出有多少文件。 wc
只会计算该流的全部内容。
请改为尝试:
#include <stdio.h>
#include <string.h>
#define DEFAULT_LEN 70
int main (int argc, char *argv[]) {
FILE *file;
// Either select standard input or open the given file.
if (argc == 1) {
file = stdin;
} else {
file = fopen (argv[1], "r");
if (file == NULL) {
printf ("I'm sorry Dave, I can't do that\n");
printf (" (open the file '%s', that is).\n", argv[1]);
return 1;
}
}
// Now you're connected to stdin or the file itself, no
// difference in handling them (unless you do weird fseek
// sort of stuff).
char temp[DEFAULT_LEN];
fgets (temp, DEFAULT_LEN, file);
printf ("%s\n", temp);
// Only close file if you opened it yourself.
if (argc != 1)
fclose (file);
return 0;
}
这允许您使用文件和标准输入方法,如下所示:
pax> prog prog.c
#include <stdio.h>
pax> echo hello | prog
hello
答案 1 :(得分:1)
将内容管道化为流程不将值放入argv
;相反,它将值放在该进程的stdin
。
您需要检查argc
是否大于1.如果是,则argv[1]
具有您已经给出的文件名(好吧,无论如何,该程序的第一个参数)。如果没有,您需要从stdin
读取以获取文件名。
答案 2 :(得分:0)
要从contantenated读取,您需要阅读STDIN
char c = (char)fgetc(stdin)