Я делаю что-то вроде игры отелло. Я получаю файл, содержащий строки, и мне нужно их прочитать и обработать, чтобы сделать доску такой, какая она есть. Пример полученного файла:
Затем я бы преобразовал символы в числа, чтобы они могли поместиться в 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
. Это условие всегда верно.
while(tomaJugada(&fp,jugada)) { ... }
будет более звуковым циклом, где tomaJugada
возвращает true
или false
в зависимости от того, успешно ли он прочитал и проанализировал строку.
EOF в c - это просто константа (обычно -1), EOF != 1 всегда будет оцениваться одинаково (это гарантированно верно, поскольку EOF всегда будет отрицательным). Что вам нужно сделать, так это проверить, возвращает ли fgets нулевой указатель (то есть в функции tomaJugada), и когда это происходит, то либо произошла ошибка, либо вы достигли конца файла. Чтобы устранить неоднозначность между ними, вы можете, например, использовать функцию feof.
Указатель NULL, возвращенный из fgets, означает, что произошла ошибка EOF или произошла ошибка, и вам нужно использовать feof и/или ferror, чтобы различать эти случаи.
Да, на самом деле хороший момент, нулевой указатель может быть возвращен и при возникновении ошибки
Да, я указал, что неравенство всегда будет истинным, но значение EOF обычно равно -1. Я буду расширять это
@Bodo Проверка feof() имеет преимущество перед проверкой ferror(). Когда индикатор ошибки установлен перед fgets() и происходит конец файла, ferror() и feof() оба возвращают true, даже если NULL возвращает из-за конца файла.
Спасибо всем за ответы и подсказки решений. Хорошего дня!
Что EOF != 1 должен делать? Это всегда будет правдой. EOF не изменяется и обычно определяется как -1.