c++ WriteFile无法追加,但始终覆盖

xxls0lw8  于 2023-04-01  发布在  其他
关注(0)|答案(2)|浏览(257)
HANDLE hFile = CreateFile("test.txt", FILE_GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

ULONG nWritten = 0;
WriteFile(hFile, "line-to-be-appened\r\n", strlen("line-to-be-appened\r\n"), &nWritten, NULL);

CloseFile(hFile);

当上面的代码片段打开一个现有的文件test.txt,并期望将"line-to-be-appened\r\n"附加到文件的末尾。然而,它只是覆盖了文件。
我怎样才能使它在最后追加?

z0qdvdin

z0qdvdin1#

当你打开文件时,默认情况下,它的读写指针在文件的开头。因此,你写的是文件的开头,覆盖了已经存在的内容。
要在文件末尾追加,您需要在写入之前查找到文件末尾,方法如下:

  • 通过SetFilePointer/Ex()手动查找,例如:
HANDLE hFile = CreateFile("test.txt", FILE_GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

SetFilePointer(hFile, 0, NULL, FILE_END); // <-- add this

ULONG nWritten = 0;
WriteFile(hFile, "line-to-be-appened\r\n", strlen("line-to-be-appened\r\n"), &nWritten, NULL);

CloseFile(hFile);
  • 打开文件,只需要FILE_APPEND_DATA标志本身,然后它将为您处理查找,例如:
HANDLE hFile = CreateFile("test.txt", FILE_APPEND_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

ULONG nWritten = 0;
WriteFile(hFile, "line-to-be-appened\r\n", strlen("line-to-be-appened\r\n"), &nWritten, NULL);

CloseFile(hFile);

FILE_GENERIC_WRITE包括FILE_WRITE_DATAFILE_APPEND_DATA,但FILE_WRITE_DATAprevents FILE_APPEND_DATA from seeking automatically
对于本地文件,如果指定了[FILE_APPEND_DATA]而没有指定FILE_WRITE_DATA,则写入操作不会覆盖现有数据。

np8igboo

np8igboo2#

你可以使用这段代码。这将在tour文件中追加文本,但不会覆盖文件。

int main()
{
    ofstream hfile;
    hfile.open("test.txt", std::ios_base::app);
    hfile << "line-to-be-appened" << endl;
    hfile.close();
}

相关问题