простой C код для чтения файла или ввода - PullRequest
0 голосов
/ 19 апреля 2020

Абсолютно новый для C. Я пытаюсь написать программу для чтения целых чисел, содержащихся в файле (передается как аргумент) или из stdin. Первое считанное число должно указывать размер массива. У меня есть кое-что, но это бросает ошибку сегментации. Пожалуйста, помогите.

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char* argv[]) {

    FILE *f;
    int n, numbers[n], firstNum;

    if (argc != 0)
    {

        f = fopen(argv[1], "r");

        fscanf(f, "%d", & firstNum);

        int numbersArray[firstNum];

        for (int i = 0; i < firstNum; i++)
        {
            fscanf(f, "%d", &numbersArray[i]);
        }

        for (int i = firstNum; 0 <= i; i--)
        {
            printf("Numbers: %d\n\n", numbersArray[i]);
        }
        fclose(f);
    }
    else
        scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        fscanf(stdin, "%d", &numbers[i]);
        printf("%d\n", i, numbers[i]);
    }

    return 0;
}

1 Ответ

0 голосов
/ 19 апреля 2020

Прежде всего, всегда инициализируйте ваши переменные, такие как kaylum и я, упомянутые в комментариях. В отличие от некоторых других языков программирования C не инициализирует ваши переменные для вас. Теперь для вопроса, который вы разместили, вы поняли, что идея в основном правильная, но есть вещи, которые я предлагаю вам изменить:

int n, numbers[n], firstNum;

на

int n = 0, numbers[1000], firstNum = 0;

Если вас это не устраивает Вы можете переместить числа [n] ниже, когда инициализируется n, но я бы не советовал этого. Вместо этого, поскольку вы изучаете C, посмотрите на динамически размещаемые массивы с помощью указателей. Некоторые ссылки, которые помогут вам понять указатели:

https://www.cprogramming.com/tutorial/c/lesson6.html https://www.tutorialspoint.com/cprogramming/c_pointers.htm

Далее посмотрите на ваш fopen он имеет возвращаемое значение, которое сообщает вам, удалось ли открыть запрошенный вами файл.

Таким образом, вы можете добавить:

    f = fopen(argv[1], "r");

    if (f == NULL)
    {
        printf("File Not Found!");
        return -1;
    }

Измените условие, чтобы оно соответствовало способу обработки этой ошибки.

Когда вы читаете файл, пользователь указывает размер читаемого массива, но вы должны учитывать тот факт, что файл может не содержать точное количество элементов. Функция, которую вы используете fscanf, может сообщить вам об этом, и это возвращаемое значение. Он вернет EOF, что является специальным значением, которое переводится в конец файла.

Рассмотрите возможность изменения вашего fscanf следующим образом:

    if (fscanf(f, "%d", &firstNum) == EOF)
    {
        printf("ERROR");
    }

Или, если вы используете для l oop put break

Последнее, что вам не нужно явно использовать fscanf для stdin, пользователь указал, что он введет его через stdin, так что вы можете просто также используйте scanf. Надеюсь, что это поможет и удачи вам в ваших будущих C начинаниях.

...