2

我正在尝试打开一个文本文件,将一些数据写入其中,然后在已写入文件的数据的末尾追加一些数据,但这不起作用。任何人都可以帮我找出我的代码的问题吗? 代码片段:

char buffer[]="Write this text to file";
DWORD dwWritten; // number of bytes written to file
HANDLE hFile;  

hFile=CreateFile("file.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
if(hFile==INVALID_HANDLE_VALUE)
  {
    MessageBox(0,"Could not create/open a file","Error",16);
    return 0;
  }
WriteFile(hFile,buffer,sizeof(buffer),&dwWritten,0);

DWORD dwPtr = SetFilePointer( hFile, dwWritten, NULL, FILE_END); //set pointer position to end file

WriteFile(hFile,buffer,sizeof(buffer),&dwPtr,NULL); 

CloseHandle(hFile);
4

3 回答 3

7

如果要将数据附加到文件,可以使用 FILE_APPEND_DATA 标志将其传递给 CreateFile 方法。这可以通过使用包含 FILE_APPEND_DATA 的 FILE_GENERIC_WRITE 标志来完成

hFile=CreateFile("file.txt",FILE_GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);

当您写入文件时,文件指针也会移动并指向当前位置。如果您想写入文件末尾,您可以使用

SetFilePointer( hFile, 0, NULL, FILE_END);

并使用 WriteFile 作为

WriteFile(hFile,buffer,strlen(buffer),&dwWritten,NULL); 
于 2013-03-29T08:22:27.740 回答
3

不需要调用 to SetFilePointer(),因为后续WriteFile()调用将在第一个写入数据之后写入数据WriteFile():删除对 的调用SetFilePointer()

调用SetFilePointer()将文件指针dwWritten字节移动到其当前位置之外,并且当前位置位于刚刚写入的数据的末尾。

检查结果WriteFile()以确保数据已成功写入,重要的是在任何错误消息中包含 的值GetLastError()或其描述FormatMessage(),以便知道失败的实际原因:

if(hFile==INVALID_HANDLE_VALUE)
{
    char error_msg[128];
    sprintf(error_msg, "Could not create/open a file: %d", GetLastError());
    MessageBox(0,error_msg,"Error",16);
    return 0;
}
于 2013-03-29T08:06:57.780 回答
1

如果要创建文本行,还需要在每行末尾输出 CR+LF 字符,例如:

char[] crlf = "\r\n";

并添加

WriteFile(hFile, crlf, sizeof(crlf), &dwWritten, 0);

在写完每个字符串之后。

或者,使用文件流而不是句柄,以下代码等效于您的代码:

char buffer[]="Write this text to file";
FILE *stream;
if ((stream = fopen("file.txt", "w+")) == NULL)
{    MessageBox(0,"Could not create/open a file","Error",16);
    return 0;
}
fprintf(stream, "%s\n", buffer);
fseek(stream, 0L, SEEK_END);
fprintf(stream, "%s\n", buffer);
fclose(stream);
于 2013-03-29T08:31:01.163 回答