一時ファイルに書き直して元のファイルを上書きして編集したいテキストファイルがあります。このコードは単純化されているのでそれをしませんが、私が抱えている問題が含まれています。Windowsでは、名前変更機能が失敗すると、一見ランダムな回数の実行後に、EXAMPLE.TXTファイルが表示されなくなります。理由はわかりませんが、これまでのところLinuxでは問題なく動作しています。なぜこれが発生するのですか?また、名前を変更せずにプログラム内から元のファイルを上書きするなど、まったく異なる方向に進むことをどのように解決できますか?
さらに、他にどのようなより良い方法がありますか?このメソッドには、removeが呼び出された直後、名前を変更する前にユーザーがプログラムを閉じるなど、Windowsに他の欠陥があります。これは、Linuxでは問題になりません(removeを削除した後)。
#include <stdio.h>
#include <assert.h>
int main(int argc, char *argv[]) {
unsigned int i=0;
FILE *fileStream, *tempStream;
char fileName[] = "EXAMPLE.TXT";
char *tempName = tmpnam(NULL);
while(1) {
printf("%u\n",i++);
assert(fileStream = fopen(fileName, "r+"));
assert(tempStream = fopen(tempName, "w"));
fprintf(tempStream,"LINE\n");
fflush(tempStream); /* fclose alone is enough on linux, but windows will sometimes not fully flush when closing! */
assert(fclose(tempStream) == 0);
assert(fclose(fileStream) == 0);
assert(remove(fileName) == 0); /* windows fails if the file already exists, linux overwrites */
assert(rename(tempName,fileName) == 0);
}
}