0

この関数を使用して、データのブロックをファイル バッファーに読み込み、効率的に行う必要があります。関数の呼び出しでは、バッファから次の文字を返すか、データの新しいブロックを読み取って、その新しいブロックから最初の文字を返す必要があります。これが私がこれまでに持っているものです。どんな助けでも大歓迎です。

int get_next_char(int fd)   {

    static char file_buffer[FILE_BUFFER_SIZE];
    static int next;
    static int i= 0;

    while((next = read( fd,&file_buffer, FILE_BUFFER_SIZE)) > 0) {
        // next equals number of chars actually read from fd
        while(i < next) i++;
    }

    if( next  == -1 || next== '\0') {
        return EXIT_FAILURE;
    } else {
        return file_buffer[i];
    }
}
4

1 に答える 1

1

fgetcこのためのシステム コールを使用して、独自の内部バッファ バージョンを実装できます。些細なことは次のようになります。

#define BUF_SIZE 1024

int fgetc_impl(FILE* fp) {
    static FILE *pBuffered;
    static char buffer[BUF_SIZE];
    static int start = 0, end = 0;

    // conditions under which you'll need to make a syscall to read into
    // the local buffer. Either a new file descriptor has been presented, or
    // we've read to the end of the local buffer and need to re-read a new chunk into it
    if (pBuffered != fp || start == end) {
        pBuffered = fp;
        end = read((int)fp, buffer, BUF_SIZE);
        start = 0;

        // mask the syscall failure and report it as an EOF, change this behaviour if you want.
        if (end < 0) {
            end = 0; 
        }
    }

    // return EOF if the syscall to read failed, or couldn't read any more data from the file descriptor.
    return end == 0 ? EOF : buffer[start++];
}

簡単な使用法は次のとおりです。

FILE *fp = fopen("test.txt", "r");
int c = 0;
while ( (c = fgetc_impl(fp)) != EOF ) {
    printf("%c", (char)c);
}
fclose(fp);
于 2013-03-20T02:44:45.120 に答える