用C++;和Linux 我必须在Linux上实现一个带C++的缓冲写入器。现在我遇到了一个问题:我可以向文件中写入字符,但除此之外,文件中填充了无效字符(在gedit中,文件在实际字符之后填充了\00)

用C++;和Linux 我必须在Linux上实现一个带C++的缓冲写入器。现在我遇到了一个问题:我可以向文件中写入字符,但除此之外,文件中填充了无效字符(在gedit中,文件在实际字符之后填充了\00),c++,linux,invalid-characters,C++,Linux,Invalid Characters,下面是代码的一部分: 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");

下面是代码的一部分:

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;
}
BufferedWriter::BufferedWriter(常量字符*路径){
pagesize=getpagesize();
if((fd=open(路径,O_WRONLY | O_DIRECT | O_CREAT | O_TRUNC,S_IRWXU))
== -1) {
perror(“BufferedWriter:打开文件时出错”);
投掷-1;
}
if(posix_memalign((void**)和缓冲区、页面大小、页面大小)!=0){
perror(“BufferedWriter:分配内存时出错”);
投掷-3;
}
对于(int i=0;i

void BufferedWriter::writeChar(char c){
缓冲区[charCnt]=c;
charCnt++;
if(charCnt==页面大小){
if(写入(fd、缓冲区、页面大小)=-1){
perror(“BufferedWriter:写入文件时出错”);
投掷-5;
}
对于(int i=0;i
当我初始化我的缓冲区时(例如使用空格),一切正常,但是有没有其他方法来防止“无效字符”


感谢您帮助我

,因为您使用的是
O\u DIRECT
,显然您被迫以
pagesize
增量编写。但是,这意味着您的文件将始终填充为
pagesize
的倍数。在您当前的代码中,它将被填充为零,因为您每次填充页面之前都会将页面置零


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

写入少于一页的代码在哪里?你为什么一直把缓冲区归零?既然您知道其中有多少字节的数据,为什么不直接访问无效的值呢?顺便说一句,您可能无法帮助自己使用O_DIRECT。你需要更多的东西来超越内核免费提供的功能,并且不是所有的文件系统都支持O_DIRECT,所以你必须检查你没有写入VFAT等等。当我尝试写入少于一个页面时,例如“write(fd,buffer,charCnt)”,写入函数会出现错误(无效参数)。我必须使用的O_DIRECT-Flag(作为练习的一部分)文件的最后一页将用NUL填充,因为您总是以页面大小递增。最后可能需要将
ftruncate()
调整到实际大小。谢谢大家的帮助@JoeZ对
ftruncate()
的评论是我处理问题的一种方式。
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;
     }
}