如果没有给定的文件,如何从 argv 或 stdin 中读取?

问题描述 投票:1回答:1

我有一个计算彩票的程序(这个彩票在一个文件.txt中),并在另一个文件中写入赢家的彩票。我有一个名为evaluate_tickets(file, lottery_numers, winner...)的子函数。

在shell中,我写道 ./program arg1 arg2... (arg1, arg2是文本文件,即file. txt)

但现在,我想做 ./program < file.txt. 问题是我不知道如何发送evaluate_tickets的参数 "file",因为我通过stdin接收信息。

c command-line-arguments stdin argv
1个回答
6
投票

定义一个流指针 FILE *fp; 读取到输入文件。

  • 如果你想从一个文件中读取输入,使用 fp = fopen(filename, "r"); 打开文件,并在处理后用 fclose(fp);.
  • 如果你想从标准输入中读取输入,只需在输入中指定 fp = stdin; 而不是使用 fopen().

下面是一个简短的例子。

#include <stdio.h>

int main(int argc, char *argv[]) {
    FILE *fp;
    int c, lines;

    if (argc > 1) {
        fp = fopen(argv[1], "r");
        if (fp == NULL) {
            fprintf(stderr, "cannot open %s\n", argv[1]);
            return 1;
        }
    } else {
        fp = stdin; /* read from standard input if no argument on the command line */
    }

    lines = 0;
    while ((c = getc(fp)) != EOF) {
        lines += (c == '\n');
    }
    printf("%d lines\n", lines);
    if (argc > 1) {
        fclose(fp);
    }
    return 0;
}

下面是同样的例子,用更简洁的方法,通过... ... stdin 或开放 FILE 指向一个特设函数的指针。注意它如何处理所有命令行参数。

#include <stdio.h>

void count_lines(FILE *fp, const char *name) {
    int c, lines = 0;
    while ((c = getc(fp)) != EOF) {
        lines += (c == '\n');
    }
    printf("%s: %d lines\n", name, lines);
}

int main(int argc, char *argv[]) {
    FILE *fp;

    if (argc > 1) {
        for (int i = 1; i < argc; i++) {
            fp = fopen(argv[i], "r");
            if (fp == NULL) {
                fprintf(stderr, "cannot open %s\n", argv[i]);
                return 1;
            }
            count_lines(fp, argv[i]);
            fclose(fp);
        }
    } else {
        /* read from standard input if no argument on the command line */
        count_lines(stdin, "<stdin>");
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.