【发布时间】:2018-04-04 13:01:02
【问题描述】:
目前我有这个代码:
int main(int argc,char* argv[]) {
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
char * txtfile = argv[1];
fp = fopen(txtfile, "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1) {
printf("Retrieved line of length %zu :\n", read);
printf("%s", line);
}
fclose(fp);
if (line)
free(line);
exit(EXIT_SUCCESS);
return 0;
}
它的功能是逐行读取文件并打印其内容以及该行上的字符数,但是当我尝试传递尖括号如'>'或'
./hello < output.txt
读取文件。
注意,我得到的规范说我的代码将以这种特定的方式进行测试,我只是想知道如何在没有引号的情况下使用“(添加了 OP 评论,以明确不可更改的要求。)
有什么办法可以解决这个问题吗?任何提示将不胜感激!
【问题讨论】:
-
>是一个 shell 命令。 Ist 会将前一个命令的输出重定向到一个文件。<将从文件中读取。 -
./hello < output.txt实际上并没有将<和output.txt作为参数传递。 -
您要解决的是问题是什么?您的代码将通过将 output.txt 的内容作为输入进行测试。因此,您读取输入的所有方式(例如
scanf())都将从该文件接收文本。您的程序的目标是从用户那里读取某些内容并对该输入做出反应。如果这不是真的,那么请举一个你的编程作业的例子,并解释为什么使用scanf()(或其他东西)不适用于访问测试输入。 -
嗯,将被提供的参数将是作为命令行参数的文本文件的名称(所以我不知道如何使用 scanf),恰好角度支架会在那里。我想知道的是尖括号的作用以及如何使代码正常工作,因为目前它还没有。
-
代码无条件地尝试打开
argv[1](通过txtfile)。这是不好的。你是对的,@Yunnosch,调用./hello < output.txt不会有非空的argv[1]— 只有argv[0]和argc == 1和argv[1] == NULL。所以我建议的检查将有助于防止程序崩溃,并有助于证明<和重定向的文件名output.txt都不是作为程序的参数给出的。