特定の宿題については、標準Cでシーケンシャルファイルを使用する基本的なデータストレージシステムを実装しています。これは、一度に複数のレコードをロードすることはできません。したがって、基本的な部分は、元のレコードで行ったすべての結果が保存される新しいファイルを作成することです。以前のファイルの名前が変更され、作業名で新しいファイルが作成されます。コードは、Windows7のMinGW5.1.6でコンパイルされています。
問題は、この特定のバージョンのコード(ほぼ同じバージョンのコードが関数の周りに浮かんでいる)が常に古いファイルを削除するとは限らないため、名前の変更が失敗し、保存されたデータがfopen()によって消去されることです。 。
FILE *archivo, *antiguo;
remove("IndiceNecesidades.old"); // This randomly fails to work in time.
rename("IndiceNecesidades.dat", "IndiceNecesidades.old"); // So rename() fails.
antiguo = fopen("IndiceNecesidades.old", "rb");
// But apparently it still gets deleted, since this turns out null (and I never find the .old in my working folder after the program's done).
archivo = fopen("IndiceNecesidades.dat", "wb"); // And here the data gets wiped.
基本的に、.oldが以前に存在する場合は常に、rename()が正常に有効になるのに間に合うように削除されない可能性があります。内部と外部の両方で名前が競合する可能性はありません。
奇妙なことは、それがこの特定のファイルだけにあるということです。名前がNecesidades.dat(3つの異なる関数で発生)に変更されていることを除いて、同一のスニペットは完全に正常に機能します。
// I'm yet to see this snippet fail.
FILE *antiguo, *archivo;
remove("Necesidades.old");
rename("Necesidades.dat", "Necesidades.old");
antiguo = fopen("Necesidades.old", "rb");
archivo = fopen("Necesidades.dat", "wb");
なぜこれが発生するのか、および/またはrename()が実行されるまでにremove()コマンドが有効になっていることを確認するにはどうすればよいですか?(fopen()がnull以外のポインターを返す限り、whileループを使用してremove()の呼び出しを再度強制することを考えましたが、削除要求などでOSがオーバーフローしたためにクラッシュを懇願するように聞こえます。)