Как использовать 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
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
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

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