0

Linux で C++ を使用してバッファ付きライターを実装する必要があります。ここで問題が発生しました。ファイルに文字を書き込むことはできますが、さらにファイルが無効な文字で埋められます (gedit では、ファイルは実際の文字の後に \00 で埋められます)。

コードの一部を次に示します。

BufferedWriter::BufferedWriter(const char* path) {
    pagesize = getpagesize();
    if ((fd = open(path, O_WRONLY | O_DIRECT | O_CREAT | O_TRUNC, S_IRWXU))
        == -1) {
        perror("BufferedWriter: Error while opening file");
        throw -1;
    }
    if (posix_memalign((void**) &buffer, pagesize, pagesize) != 0) {
        perror("BufferedWriter: Error while allocating memory");
        throw -3;
    }
    for (int i = 0; i < pagesize; i++) {
        buffer[i] = 0;
    }
    charCnt = 0;
}

...

void BufferedWriter::writeChar(char c) {
    buffer[charCnt] = c;
    charCnt++;
    if (charCnt == pagesize) {
        if (write(fd, buffer, pagesize) == -1) {
            perror("BufferedWriter: Error while writing to file");
            throw -5;
        }
        for (int i = 0; i < pagesize; i++) {
            buffer[i] = 0;
        }
        charCnt = 0;
     }
}

バッファを空白などで初期化すると、すべて正常に動作しますが、「無効な文字」を防ぐ別の方法はありますか?

私を助けてくれてありがとう

4

1 に答える 1

0

を使用しているためO_DIRECT、明らかにpagesizeインクリメントで書く必要があります。ただし、これは、ファイルが常に の倍数にパディングされることを意味しますpagesize。現在のコードでは、ページを埋める前に毎回ページをゼロにするため、ゼロでパディングされます。

これに対処する 1 つの方法は、ファイル内にある必要がある実際のデータ量を追跡し、ftruncate()ファイルを閉じる前に目的のサイズにすることです。

于 2013-11-26T12:47:26.410 に答える