如果在 C 中没有给出文件,则使用 stdin 和 stdout
Using stdin and stdout if no file is given in C
我有一个程序可以将源文件复制到目标文件。
如果用户只提供这些文件中的一个或一个都不提供,我想使用 stdin 或 stdout。
例如:命令行参数中未提供源文件名,但提供了目标文件。该程序应从标准输入读取输入并写入给定的目标文件。
我知道 freopen()
但我不知道在这种情况下我应该如何使用它。
下面是我认为逻辑是如何完成的样板代码,但我找不到任何有助于我学习的例子。任何见解表示赞赏。
char *src = NULL; (unless user provides in preceding code not shown)
char *dest = NULL; (^^)
// open files based on availability
// src and dest not provided, read from stdin and write to stdout
if (src == NULL && dest == NULL) {
FILE *in = freopen(src, "r", stdin);
FILE *out = freopen(dest, "w", stdout);
// TODO
fclose(in);
fclose(out);
// src not provided, read from stdin
} else if (src == NULL) {
FILE *in = freopen(src, "r", stdin);
// TODO
fclose(in);
// dest not provided, write result to stdout
} else {
FILE *out = freopen(dest, "w", stdout);
// TODO
fclose(out);
}
只是 if 语句而已。验证 src 是否为 NULL,如果是 fopen(stdin, "r")
但之后不要关闭它,否则会导致未定义的行为(我说的是 stdin
)。
对于 stdout
,您甚至不必打开它,就可以直接在其中写入。示例:
int is_in = src == NULL;
FILE *in = fopen(is_in ? stdin : src, "r")
if (!is_in)
fclose(in);
我倾向于避免 freopen
并使用不同的方法。我定义了两个 FILE *
变量,如果提供了文件名,则使用 fopen()
;如果没有,则根据需要将它们设置为 stdin
或 stdout
:
#include <stdio.h>
/* copying files: 0, 1 or 2 arguments */
int main(int argc, char *argv[]) {
FILE *in = stdin;
FILE *out = stdout;
char *srcfile = NULL;
char *destfile = NULL;
int c;
if (argc > 1) {
srcfile = argv[1];
if (argc > 2)
destfile = argv[2];
}
if (srcfile && strcmp(srcfile, "-")) {
if ((in = fopen(srcfile, "r")) == NULL) {
perror(srcfile);
return 1;
}
}
if (destfile && strcmp(destfile, "-")) {
if ((out = fopen(destfile, "w")) == NULL) {
perror(destfile);
return 1;
}
}
while ((c = getc(in)) != EOF) {
putc(c, out);
}
if (in != stdin)
fclose(in);
if (out != stdout)
fclose(out);
return 0;
}
我有一个程序可以将源文件复制到目标文件。
如果用户只提供这些文件中的一个或一个都不提供,我想使用 stdin 或 stdout。
例如:命令行参数中未提供源文件名,但提供了目标文件。该程序应从标准输入读取输入并写入给定的目标文件。
我知道 freopen()
但我不知道在这种情况下我应该如何使用它。
下面是我认为逻辑是如何完成的样板代码,但我找不到任何有助于我学习的例子。任何见解表示赞赏。
char *src = NULL; (unless user provides in preceding code not shown)
char *dest = NULL; (^^)
// open files based on availability
// src and dest not provided, read from stdin and write to stdout
if (src == NULL && dest == NULL) {
FILE *in = freopen(src, "r", stdin);
FILE *out = freopen(dest, "w", stdout);
// TODO
fclose(in);
fclose(out);
// src not provided, read from stdin
} else if (src == NULL) {
FILE *in = freopen(src, "r", stdin);
// TODO
fclose(in);
// dest not provided, write result to stdout
} else {
FILE *out = freopen(dest, "w", stdout);
// TODO
fclose(out);
}
只是 if 语句而已。验证 src 是否为 NULL,如果是 fopen(stdin, "r")
但之后不要关闭它,否则会导致未定义的行为(我说的是 stdin
)。
对于 stdout
,您甚至不必打开它,就可以直接在其中写入。示例:
int is_in = src == NULL;
FILE *in = fopen(is_in ? stdin : src, "r")
if (!is_in)
fclose(in);
我倾向于避免 freopen
并使用不同的方法。我定义了两个 FILE *
变量,如果提供了文件名,则使用 fopen()
;如果没有,则根据需要将它们设置为 stdin
或 stdout
:
#include <stdio.h>
/* copying files: 0, 1 or 2 arguments */
int main(int argc, char *argv[]) {
FILE *in = stdin;
FILE *out = stdout;
char *srcfile = NULL;
char *destfile = NULL;
int c;
if (argc > 1) {
srcfile = argv[1];
if (argc > 2)
destfile = argv[2];
}
if (srcfile && strcmp(srcfile, "-")) {
if ((in = fopen(srcfile, "r")) == NULL) {
perror(srcfile);
return 1;
}
}
if (destfile && strcmp(destfile, "-")) {
if ((out = fopen(destfile, "w")) == NULL) {
perror(destfile);
return 1;
}
}
while ((c = getc(in)) != EOF) {
putc(c, out);
}
if (in != stdin)
fclose(in);
if (out != stdout)
fclose(out);
return 0;
}