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