Возникла проблема с чтением строки из файла имен в C - PullRequest
2 голосов
/ 18 февраля 2020

Я читаю текстовый файл, в котором есть строка на каждом имени. Мне нужно сгенерировать случайное число от 0 до 99, чтобы определить индекс имени для выбора. Когда я использую метод fscanf () и затем пытаюсь отобразить прочитанную строку, выводится пустая строка. Я проверил это, и я ввожу оператор if, чтобы назначить строку для переменной, кажется, есть проблема с назначением имени.

int indexOfName = rand() % 100;
        printf("%d\n", indexOfName);

        FILE *fileOfNames;
        char str[30];
        char *filename = "theFilePath";

        fileOfNames = fopen(filename, "r");
        rewind(fileOfNames);
        if (fileOfNames == NULL)
        {
            printf("Could not open file %s", filename);
            return 1;
        }
        int i = 0;
        while (fgets(str, 30, fileOfNames) != NULL)
        {
            if (i == indexOfName)
            {
                fscanf(fileOfNames, "%s", str);
            }
            i++;
        }
        printf("%s\n", str);
        fclose(fileOfNames);
        return 0;

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Вам нужно break после if (i == indexOfName). В противном случае вы просто перезапишете str, пока не достигнете конца файла.

Возможно, вы даже не захотите fscanf в операторе if, поскольку while (fgets(str, 30, fileOfNames) != NULL) записывает строку в str уже.

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

Ваш код имеет 2 проблемы:

1) Он продолжает перезаписывать str после того, как находит нужную запись. Вы можете избежать этого, остановившись после итерации до indexOfName.

2) После того, как он присваивает правильное значение str, он снова перезаписывает его с вызовом fscanf.

Возможно, имеет смысл использовать a для l oop для этого, поскольку вы хотите указать c количество итераций. Вы можете заставить ваш код работать правильно, заменив while l oop на l oop:

for (int i = 0; i < indexOfName; i++) fgets(str, 30, fileOfNames);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...