Чтение из файлов, переданных в качестве аргументов командной строки - PullRequest
2 голосов
/ 26 февраля 2011

Я пытаюсь разобрать данный текстовый файл, но пока что моя программа, похоже, не читает правильно.

#include <stdio.h>


int main(int argc, char *argv[])
{
    FILE *fr; //file pointer
    int buildingFloors = 1;

    printf("sanity check\n");  

    fr = fopen (argv[0], "r");
    fscanf(fr, "%d", &buildingFloors );

    printf("%d\n", buildingFloors);

    fclose(fr);

    return 0;
}

Я компилирую программу и запускаю ее на своем компьютере с Redhat Linux следующей командой:

./sjf file.text

file.text - это текстовый документ с «4» в качестве первого символа. Так что я ожидаю, что мой результат будет

sanity check
4

Однако, когда я запускаю свою программу, я вместо этого получаю

sanity check
1

Что означает, что fscanf неправильно прочитал первый символ - 4. Есть ли у меня какая-то синтаксическая ошибка, препятствующая ожидаемой функциональности кода? Я должен отсканировать для символа, а затем каким-то образом преобразовать его в int?

Ответы [ 3 ]

5 голосов
/ 26 февраля 2011

argv[0] - это название программы (./sjf в вашем случае), поэтому вы пытаетесь прочитать в исполняемом файле вашей программы.Вместо этого используйте argv[1], чтобы получить первый реальный программный аргумент.

4 голосов
/ 26 февраля 2011

Одна вещь, которая сразу приходит на ум, состоит в том, что аргументы программы включают имя исполняемого файла в качестве первого элемента

argv[0] - это "sjf"

argv[1] - это "file.text"

, поэтому вы должны использовать

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

Помните, что при отладке всегда пытайтесь сузить проблему, если вы знаете местоположение ошибки, причина часто становится очевидной или, по крайней мере, расследуемой.

В этом случае вам следует проверить argc >= 2, распечатать argv[1], чтобы убедиться, что вы пытаетесь открыть нужный файл, а затем проверить, что файл был успешно открыт.

Наконец, проверьте коды ошибок fscanf, чтобы увидеть, что fscanf смог прочитать число.

0 голосов
/ 26 февраля 2011

Ваш код выглядит ясным и понятным, но не хватает одной важной вещи: обработка ошибок.

Что произойдет, если файл, который вы хотите открыть, не существует? fopen возвращает NULL в этом случае.

Что произойдет, если файл не начинается с цифры? fscanf возвращает количество полей, которые были успешно прочитаны, поэтому вы должны убедиться, что возвращаемое значение равно как минимум 1.

Вам нужно как-то обработать эти случаи, возможно, напечатав какое-нибудь сообщение об ошибке и выйдя из программы. Когда вы это сделаете, обязательно включите соответствующую информацию в сообщения об ошибках. Тогда вы найдете ошибку, о которой уже упоминали другие ответы.

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