从 C 中的标准输入获取文件路径



>我正在尝试将文件传递给我的程序,但它总是出错,无法打开文件。

我的命令是:(我在桌面路径上,我正在使用 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].根据您的输入需要,请增加大小。

相关内容

  • 没有找到相关文章