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. 在您当前的代码中,它将用零填充,因为您每次在填充之前将页面归零。

解决此问题的一种方法是跟踪文件中应包含的实际数据量,并ftruncate()在关闭文件之前将文件调整为所需的大小。

于 2013-11-26T12:47:26.410 回答