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