Когда вы запускаете программу, функция main()
- это не первое, что вызывается, вызывается довольно много вещей, прежде чем вызывается функция main()
. Одной из таких вещей является открытие stdin
, stdout
и stderr
. В общем, вам не нужно беспокоиться о деталях того, как ОС это делает, вы просто можете передать, что при выполнении main()
эти потоки открыты, и вы можете их использовать.
Так что в вашем случае , вы можете сделать это:
#include <stdio.h>
int main(int args, char **argv) {
FILE *fp;
if(args == 1) {
fp = stdin;
} else {
fp = fopen(argv[1], "r");
if(fp == NULL) {
fprintf(stderr, "Unable to open %s for writing\n", argv[1]);
return 1;
}
}
// do your read operations on fp
if(fp != stdin) {
fclose(fp);
}
return 0;
}
Поэтому, когда вы вызываете программу без аргументов, используется stdin
, в противном случае используется файл.
Причина сбоя кода заключается в том, что
f = fopen("stdin", "r");
пытается открыть файл с буквальным названием stdin
, которого у вас, скорее всего, нет. fopen
вернет NULL
, и вы, вероятно, не проверяете это. Если вы попытаетесь использовать функцию, которая ожидает указатель FILE*
, но передает NULL
, то, скорее всего, вы получите ошибку сегмента.