在win32 api中的文本文件末尾附加文本

时间:2013-03-29 07:59:04

标签: c windows winapi text-files createfile

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

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);

3 个答案:

答案 0 :(得分:5)

如果要将数据附加到文件,可以使用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); 

答案 1 :(得分:3)

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;
}

答案 2 :(得分:1)

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

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);