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

最初の: remove the callによって書き込まれたデータの後に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 に答える