タイトルが尋ねるように、既存のデータを消去せずに押し下げながら、fopen を使用してファイルの特定のセクションにデータを書き込むにはどうすればよいですか。SEEK_SET および SEEK_CUR と共に fseek を使用しましたが、これまでのところ、新しいデータをファイルの正しいセクションに書き込むことができますが、既存のデータの最初の数行が削除されます。
2 に答える
通常のデスクトップおよびサーバー オペレーティング システムにあるファイル システムは挿入をサポートしていないため、これを行うことはできません。
ファイルを書き換える必要があります。
私はデータの「複雑な」操作にはめったに使用fopen
せず、ファイルの途中に何かを追加することは私が頻繁に行うことではないことを認めなければなりません。通常、その使用パターンが必要な場合は、ファイル全体を新しいデータで上書きするだけです。したがって、ファイルの途中にデータを追加する賢い方法があるかもしれませんが、私はそれを知りません: 上書きすることしかできないと確信しています。
ファイルの途中に追加する最も簡単な方法は次のとおりです。書き込む必要がある場所を見つけ、再配置する必要があるバイト数を見つけ、挿入するデータの長さを見つけ、書き込みカーソルを移動します。 (書き込む必要がある場所+長さ)、その時点からのデータを再配置する必要があるデータで上書きし、最初に書き込む必要があるものを書き込みます。
#include <stdio.h>
#include <stdlib.h>
size_t finsert(void* data, size_t length, FILE* fp)
{
const long writePosition = ftell(fp);
fseek(fp, 0, SEEK_END);
const long fileSize = ftell(fp);
const long relocatedDataSize = fileSize - writePosition;
char* dataToRelocate = malloc(relocatedDataSize);
fseek(fp, writePosition, SEEK_SET);
fread(dataToRelocate, relocatedDataSize, 1, fp);
fseek(fp, writePosition + length, SEEK_SET);
fwrite(dataToRelocate, relocatedDataSize, 1, fp);
free(dataToRelocate);
fseek(fp, writePosition, SEEK_SET);
return fwrite(data, length, 1, fp);
}
ファイルへの読み取りおよび書き込みアクセスが必要であることに注意してください。書き込みだけではカットされません。
また、Cole Johnson が述べたように、「データベースのような」ファイルを使用している場合は、SQLite の使用を検討してください。それはあなたのためにそのようなクレイジーなものをすべて処理し、多くのことをより簡単にします.