我正在尝试打开一个文本文件,将一些数据写入其中,然后在已经写入文件的数据末尾追加一些数据,但这不起作用。 任何人都可以帮我解决我的代码问题吗? 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);
答案 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);