我有一个糟糕的问题。我正在尝试通过 filedescriptor 和 memalign 写入文件。我可以写入它,但只有类似错误编码字符的内容会写入文件。
这是我的代码:
fdOutputFile = open(outputFile, O_CREAT | O_WRONLY | O_APPEND | O_DIRECT, 0644)
void writeThis(char* text) {
while (*text != '\0') {
// if my internal buffer is full -> write to disk
if (buffPositionOutput == outputbuf.st_blksize) {
posix_memalign((void **)&bufferO, outputbuf.st_blksize, outputbuf.st_blksize);
cout << "wrote " << pwrite(fdOutputFile, bufferO, outputbuf.st_blksize, outputOffset*outputbuf.st_blksize) << " Bytes to disk." << endl;
buffPositionOutput = 0;
++outputOffset;
}
// buffer the incoming text...
bufferO[buffPositionOutput] = *text;
++text;
++buffPositionOutput;
}
}
我认为这是对齐 - 有人可以帮助我吗? 它写入文件但不是正确的文本,只是一堆“[]”字符。
预先感谢您的帮助!
最佳答案
查看您的程序,会发生以下情况:
- 您填充最初由
buffer0+buffPositionOutput
指向的内存(具体是哪里?根据您提供的代码我不知道。)直到buffer0+outputbuf。 st_blksize
与数据。 - 您将
buffer0
指针的地址传递给posix_memalign
,它会忽略其当前值并用指向outputbuf.st_blksize
的指针覆盖它新分配的内存字节数。 - 将数据从新分配的 block 写入磁盘;这可能是任何东西,因为您刚刚分配了内存并且还没有在那里写任何东西。
这显然行不通。您可能希望通过函数顶部的 posix_memalign
初始化缓冲区,然后在使用对齐的缓冲区将数据重复写入文件时覆盖其中的 block 数据。 (每次写入数据后,将 buffpositionoutput
重置为零,但不要重新分配。)确保在完成后 free
缓冲区。
此外,为什么你使用 pwrite
而不是 write
?
下面是我将如何实现 writeThis
(保留您的变量名以便您可以将其与您的版本相匹配):
void writeThis(char *text) {
char *buffer0;
size_t buffPositionOutput = 0;
posix_memalign(&buffer0, outputbuf.st_blksize, outputbuf.st_blksize);
while (*text != 0) {
++text; ++buffPositionOutput;
if (buffPositionOutput == outputbuf.st_blksize) {
write(fdOutputFile, buffer0, outputbuf.st_blksize);
buffPositionOuput = 0;
}
}
if (buffPositionOutput != 0) {
// what do you want to do with a partial block of data? Not sure.
}
}
(为了提高速度,您可以考虑使用 memcpy
调用而不是循环。不过,您需要提前知道要写入的数据的长度。在您完成工作后担心这一点不泄漏内存的解决方案。)
关于c++ - 在 C/C++ 中将 pwrite() 写入文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6081357/