Как использовать EOF в качестве условия для завершения цикла? В С

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

  1. Алехандро, Б
  2. Федерико,Н
  3. Б
  4. Д6
  5. С4
  6. G5

затем я бы преобразовал символы в числа, чтобы они могли поместиться в int board[8][8], который я использую

Я ожидал, что когда он достигнет EOF, он выйдет из цикла, но вместо этого он никогда не останавливает цикл и продолжает повторять последнюю строку с помощью printf. Это в основной функции:

while( EOF != 1 && *error != 1)
    {
        tomaJugada(&fp,jugada);  //takes 1 line of the file
        toupper(jugada[0]);      
        int columna = convierte_a_int(jugada[0])-1;  //converts the letter to a number
        int fila =  (jugada[1]-'0')-1;               //converts the char number to int number
        printf("columna %i, fila %i \n",columna, fila);   
    }

Это вспомогательная функция:

void tomaJugada(FILE** fp, char jugada[])
{    
    fgets(jugada,5,*fp);
    jugada[2] = '\0';
    //jugada[strcspn(jugada, "\n")] = 0;
}

Я видел людей, использующих это:

int ch = getc(fp);
  while (ch != EOF){...

но это будет потреблять данные, которые мне нужно использовать, может быть, я использую их неправильно?

Резюмируя: я хочу использовать все данные в файле, достичь EOF и завершить цикл. Как я могу поставить условие для EOF?

Я надеюсь, что я хорошо объяснил, я ценю любую помощь

Что EOF != 1 должен делать? Это всегда будет правдой. EOF не изменяется и обычно определяется как -1.

Ted Lyngmo 10.01.2023 16:15
EOF != 1 - что это? EOF — это определенный символ, который обычно сравнивают с -1. Это условие всегда верно.
Eugene Sh. 10.01.2023 16:15
while(tomaJugada(&fp,jugada)) { ... } будет более звуковым циклом, где tomaJugada возвращает true или false в зависимости от того, успешно ли он прочитал и проанализировал строку.
Ted Lyngmo 10.01.2023 16:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

EOF в c - это просто константа (обычно -1), EOF != 1 всегда будет оцениваться одинаково (это гарантированно верно, поскольку EOF всегда будет отрицательным). Что вам нужно сделать, так это проверить, возвращает ли fgets нулевой указатель (то есть в функции tomaJugada), и когда это происходит, то либо произошла ошибка, либо вы достигли конца файла. Чтобы устранить неоднозначность между ними, вы можете, например, использовать функцию feof.

Указатель NULL, возвращенный из fgets, означает, что произошла ошибка EOF или произошла ошибка, и вам нужно использовать feof и/или ferror, чтобы различать эти случаи.

Bodo 10.01.2023 16:21

да, на самом деле хороший момент, нулевой указатель может быть возвращен и при возникновении ошибки

Ivaylo Strandjev 10.01.2023 16:22

Да, я указал, что неравенство всегда будет истинным, но значение EOF обычно равно -1. Я буду расширять это

Ivaylo Strandjev 10.01.2023 16:29

@Bodo Проверка feof() имеет преимущество перед проверкой ferror(). Когда индикатор ошибки установлен перед fgets() и происходит конец файла, ferror() и feof() оба возвращают true, даже если NULL возвращает из-за конца файла.

chux - Reinstate Monica 10.01.2023 16:44

Спасибо всем за ответы и подсказки решений. Хорошего дня!

dumping the core 10.01.2023 18:40

Другие вопросы по теме