@barboskin93

Как сделать ввод через стандартный поток (stdin) и через файл?

Подскажите пожалуйста. Реализую утилиту cat. Как сделать проверку на то, что если имя файла не передано, то ввод через stdin?
void Cat(int argc, char *argv[], Flags flags, const char *table[static 256]){
    for (char **filename = &argv[1], **end = &argv[argc]; filename != end; ++filename ) {
        if (**filename == '-'){
            continue;
        }
        FILE *file; 
        if (strcmp("\0", *filename) == 0){
            file = stdin;
            TreatFlag(file, flags, table);
        }
        else {
            file = fopen(*filename, "rb");
            if (errno) {
            fprintf(stderr, "%s", argv[0]);
            perror(*filename);
            continue;
        }
        TreatFlag(file, flags, table);
        fclose(file);
        } 
    }
}

Думал через сравнение с пустой строкой \0, но никак не получается.
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 4
@vanyamba-electronics
Переменная argc равна 1, если в массиве argv содержится только имя исполняемого файла (argv[0]).
Ответ написан
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
По количеству аргументов, вестимо. Если аргументов не передали - значит читаем stdin
Ответ написан
Комментировать
AshBlade
@AshBlade
Просто хочу быть счастливым
2 варианта:
- Если аргументов вообще нет, то через poll (либо select) проверяешь событие доступности данных - SO
- Некоторые Unix программы проверяют, что если передан дефис/тире -, то читать надо из stdin (учитывай)
Ответ написан
Комментировать
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Есть такая функция freopen. Можно всегда читать через scanf, read из stdin, но если указано имя файла, то переоткрыть stdin на файл:
freopen("input.txt", "rb", stdin);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы