我有一个计算彩票的程序(这个彩票在一个文件.txt中),并在另一个文件中写入赢家的彩票。我有一个名为evaluate_tickets(file, lottery_numers, winner...)的子函数。
在shell中,我写道 ./program arg1 arg2...
(arg1, arg2是文本文件,即file. txt)
但现在,我想做 ./program < file.txt
. 问题是我不知道如何发送evaluate_tickets的参数 "file",因为我通过stdin接收信息。
定义一个流指针 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;
}