2

MinGW でコンパイルされたプログラムを使用して、Windows 7 でバイナリ ファイルを読み込もうとしています。バイナリ ファイルのサイズは ~10M ですが、私のプログラムは 1000 バイト未満しか読み取ることができず、EOF に達したと見なされます。

これがコードです。私は愚かなことをしていると確信していますが、それを見つけることができないようです。

#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 であると言うでしょう。

誰かが私に何が起こっているのか教えてもらえますか? ありがとう!

ありがとう、

4

1 に答える 1

1

実際、あなたのプログラムは実際にファイル全体を読んでいます。この場合、736 バイトが残るまで、一度に 1000 バイトずつファイルを読み取ります。次に、それらの最後の 736 バイトを読み取りread736. 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. 1024and をハードコーディングするよりも、これらの魔法の値を繰り返し続けないように、1000次のようなものを使用したほうがよいでしょう。#define BUFFLEN 1024
于 2012-05-18T19:07:00.277 に答える