системный вызов read () не возвращает EOF - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь прочитать все данные из файла, используя системный вызов open ().Но у меня возникают трудности с определением конца файла.Флаг C EOF не работает.Моя программа идет в бесконечный цикл.Вот кодФайл содержит менее 100 символов.

int main()
{
 char buf[100] = {""};
 i = 0;
 int fd = open ("file1.txt", O_RDONLY);
 int bytesread = read (fd, &buf[i], 1);
 char c = buf[i];
 while (c != EOF) {
    i++;
    int bytesread = read (fd, &buf[i], 1);
    c = buf[i];
 }
}

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

read(2) не возвращается EOF.Его возвращаемые значения: 0 при достижении «конца файла», -1 при ошибке, положительное значение, когда прочитано столько байтов.Кроме того, вы проверяете данные для EOF.Ваше условие цикла неверно.

Как правило, вы также проверяете, было ли read(2) прервано, и если да, повторите попытку.

size_t i = 0;
errno = 0;
while (i < sizeof buf && read (fd, &buf[i], 1) >= 0 && errno != EINTR) {
    i++;
    errno = 0;  
 }

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

Примечание. Обычно макрос EOF также определяется значением -1.Так что может показаться, read(2) возвращает EOF, но не смущайтесь.

0 голосов
/ 16 октября 2018

Буфер не содержит EOF, он просто хранит данные в файле для чтения. Что вы можете сделать, это

while(bytesread > 0 ){
    i++;
    bytesread = read (fd, &buf[i], 1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...