c++ - 在 C/C++ 中将 pwrite() 写入文件的问题

标签 c++ linux

我有一个糟糕的问题。我正在尝试通过 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;
    }
}

我认为这是对齐 - 有人可以帮助我吗? 它写入文件但不是正确的文本,只是一堆“[]”字符。

预先感谢您的帮助!

最佳答案

查看您的程序,会发生以下情况:

  1. 您填充最初由 buffer0+buffPositionOutput 指向的内存(具体是哪里?根据您提供的代码我不知道。)直到 buffer0+outputbuf。 st_blksize 与数据。
  2. 您将 buffer0 指针的地址传递给 posix_memalign,它会忽略其当前值并用指向 outputbuf.st_blksize 的指针覆盖它新分配的内存字节数。
  3. 将数据从新分配的 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/

相关文章:

c++ - 如何将数据输入数组并通过函数打印出来?

c++ - 如何在 Visual Studio 中将库包含到项目中?

linux - awk 的多输入文件

python - 如何使用 python 的 bash 时间函数?

python - Linux 上 %include 的 CherryPy/Mako 路径问题(适用于 Windows)

linux - Linux 中的 TIPC 套接字类型

c++ - 如何在vector<vector<float>*>*中写入数据?

c++ - 我想学习COM。我应该如何进行?

c++ - 如何在作为 map 键的 vector 的 2 个数组中搜索公共(public)元素?

java - 在 FreeMarker 中使用绝对路径