>我正在尝试将文件传递给我的程序,但它总是出错,无法打开文件。
我的命令是:(我在桌面路径上,我正在使用 ubuntu(
./out < /usr/share/dict/words > out.txt 2> out2.txt
已创建输出文件,但文件输入显示为空。我得到的文件路径为:
char *infile;
scanf("%s", infile);
printf("file: %sn", infile);
我也试过:
fscanf(stdin, "%s", infile);
什么都没有改变。另外,我必须接受如上所示的输入,我知道<
意味着stdin
但我无法以某种方式阅读其内容。
这是文件打开部分和错误消息:
file = fopen(infile, "r");
if (file == 0) {
fprintf(stderr, "File failedn");
return 1;
}
您的方法似乎有些混乱:
-
将输入从包含单词的文本文件(经典
/usr/share/dict/words
文件(重定向到程序。这个文件是你的程序的输入,你可以用getchar()
、scanf()
、fgets()
等流输入函数读取内容,但文件的名称对你的程序不可用,也不需要fopen
这个文件来读取它的内容。 -
scanf("%s", buf)
是从stdin
中读取单词的一种不安全的方式。您必须传递指向char
数组的指针,而不是像在发布的片段中那样传递未初始化的指针。scanf()
将写入此指针指向的内存,因此未初始化的指针将导致未定义的行为,可能是崩溃。 -
若要安全地使用
scanf()
,必须提供要存储到目标数组中的最大字符数,否则 inoput 文件中足够长的单词将导致scanf()
写入数组末尾之外,从而导致未定义的行为。下面是一个示例:// filtering 4 letter words: char buf[100]; while (scanf("%99s", buf) == 1) { if (strlen(buf) == 4) printf("%sn", buf); }
如果要传递输入文件的路径,请使用命令行参数。
bash 命令将变为:
./a.out /usr/share/dict/words > out.txt 2> out2.txt
和main
功能:
#include <errno.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[) {
FILE *fp;
if (argc < 2) {
fprintf(stderr, "%s: missing file name argumentn", argv[0]);
return 1;
}
if ((fp = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "%s: cannot open file %s: %sn",
argv[0], argv[1], strerror(errno));
return 1;
}
// for example's sake: filtering 4 letter words:
char buf[100];
while (fscanf(fp, "%99s", buf) == 1) {
if (strlen(buf) == 4)
printf("%sn", buf);
}
fclose(fp);
return 0;
}
char *infile
只是一个指针,不会为字符串分配空间,因此不会保存输入。尝试类似char infile[50]
.根据您的输入需要,请增加大小。