2012-05-18 4 views
2

Я пытаюсь прочитать двоичный файл в Windows 7 с помощью программы, составленной MinGW. Бинарный файл имеет размер ~ 10 М, но моя программа может читать только 1000 байт, и он считает, что он достиг EOF.MinGW: чтение двоичных данных завершается

Вот код. Я уверен, что я делаю что-то глупое, но я просто не могу найти его.

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

#define TS_FILE "foo.data" 

int main(void) 
{ 
    int fd; 
    int r; 
    unsigned char buf[1024]; 

    fd = open(TS_FILE, O_RDONLY|O_BINARY); 
    printf("fd: %d\n", fd); 

    if (fd == -1) 
    { 
     exit(0); 
    } 

    for (;;) 
    { 
     r = read(fd, buf, 1000); 
     if (r != 1000) 
     { 
      printf("read error. %d\n", r); 
      perror("read"); 
     } 

     if (r == 0) 
     { 
      break; 
     } 
    } 
    close(fd); 
} 

Программа скажет, что читает 736 байт, и это EOF.

Может ли кто-нибудь сказать мне, что происходит? Благодаря!

Спасибо,

ответ

1

В самом деле, ваша программа действительно читает весь файл. Он считывает файл по 1000 байт за раз, пока в этом случае не останется 736 байт. Затем он считывает эти окончательные 736 байт и read возвращает 736. Вы ошибочно относитесь к неспособности прочитать полные 1000 байтов как ошибку, но это не ошибка. Если read терпит неудачу, тогда условие ошибки отмечено возвратом -1.

Ваш цикл должен быть, возможно, больше, как это:

for (;;) 
{ 
    r = read(fd, buf, 1000); 
    if (r == -1) 
    { 
     printf("read error\n"); 
     perror("read"); 
     exit(1); 
    } 

    if (r != 1000) 
    { 
     //entire file has been read 
     break; 
    } 
} 
close(fd); 

Пару других точек:

  1. правильный тип для r является size_t.
  2. Вместо жесткого кодирования 1024 и 1000 вам было бы лучше с чем-то вроде #define BUFFLEN 1024, чтобы вы не повторяли эти магические значения.
Смежные вопросы