gpt4 book ai didi

c++ - 使用 C++ 和 Linux 写入文件

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:31 24 4
gpt4 key购买 nike

我必须在 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;
}
}

当我初始化缓冲区时,例如使用空格,一切正常,但是有另一种方法可以防止“无效字符”吗?

谢谢你帮助我

最佳答案

由于您使用的是 O_DIRECT,因此您显然被迫以 pagesize 增量进行写入。但是,这意味着您的文件将始终被填充为 pagesize 的倍数。在您当前的代码中,它将用零填充,因为您每次在填充页面之前都会将其清零。

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

关于c++ - 使用 C++ 和 Linux 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20205908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com