Недопустимый ioctl для ошибки устройства при использовании fgets () для чтения символов из файла - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь написать простую программу на C, которая читает определенное количество символов из файла за раз, а затем сохраняет это в переменной. Например, 10 символов одновременно.

Я пытаюсь сделать это с помощью fgets (), но он продолжает выдавать ошибку FAILED: недопустимый ioctl для устройства, которое я не могу устранить и не могу найти после поиска некоторой информации о нем.

Я несколько раз пытался переписать свой код и прочитал документацию, но я до сих пор не могу найти корень проблемы.

Вот мой код:

Основная функция (я уже проверил аргументы, но для простоты опущен)

int main(int argc,char *argv[]) {
    FILE *file;
    file=check_file(argv[1]);
    readCharacters(file);
    return 0;
}

функция check_file

FILE * check_file(char *fileName)
{
    FILE *file = fopen(fileName, "rb");
    if(!file) {
        perror("SENDER: File does not exists");
        fclose(file);
        exit(1);
    }
    return file;
}

Функция чтения символов

void readCharacters(FILE* fp) {
    char buff[TOTALCHAR], *result;


if ((result = fgets(buffer,TOTALCHAR,fp)) != NULL)
      printf("The string is %s\n", result);
    else if (ferror(fp)) {
      perror("FAILED");
    } else {
      printf("EOF was reached");
    }

Если мой текстовый файл:

«Быстрая коричневая лиса перепрыгивает через ленивую собаку»

Ожидаемый результат:

First String = "Быстрый коричневый" Вторая строка = "лиса перепрыгивает" и т.д.

Фактический результат:

EOF был достигнут

РЕДАКТИРОВАТЬ: я обновил свой код после ответа на исходный вопрос, и оказалось, что EOF достигнут. Однако файл, в котором я читаю, определенно не пустой

1 Ответ

0 голосов
/ 13 апреля 2019

Этот вызов

result = fgets(buff,TOTALCHAR,fp))

вернет NULL при ошибке, но также при достижении EOF.Это не обязательно условие ошибки.Вы должны различать вручную, например, с помощью функции ferror():

if ((result = fgets(buff,TOTALCHAR,fp)) != NULL)
   printf("The string is %s\n", result);
else if (ferror(fp)) {
    perror("FAILED");
} else {
    printf("EOF was reached");
}

Вы предполагали, что EOF - ошибка, и perror() просто выведет последнюю вещь, для которой errno был установлен в,В этом случае, вероятно, это был какой-то внутренний libc-вызов ioctl().

Если эта ветвь

printf("The string is %s\n", result);

никогда не берется, то файл, который вы открываете, должен быть пустым (т.е.он сретурн EOF с первой попытки чтения)

...