Ошибка сегментации, когда не указан входной файл в командной строке - PullRequest
0 голосов
/ 08 февраля 2020

Я пишу программу, которая читает из файла, переданного в качестве аргумента, или читает из стандартного ввода, если аргументы не приводятся. Код работает нормально с переданным файлом, но я получаю ошибку сегмента, когда файл не передается. Обычно я вызываю fopen для argv [1], если файл был задан, но если файл не был задан, я вызываю:

f = fopen("stdin", "r");

Это правильный синтаксис для открытия stdin как файла?

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Когда вы запускаете программу, функция 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, то, скорее всего, вы получите ошибку сегмента.

0 голосов
/ 08 февраля 2020

ИСПОЛЬЗОВАНИЕ f = stdin; НЕ f = fopen ("stdin", "r");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...