--- LKH-2.0/SRC/WriteTour.c.bak 2007-12-28 14:14:48.000000000 +0200 +++ LKH-2.0/SRC/WriteTour.c 2008-04-17 18:00:20.038481332 +0300 @@ -1,3 +1,5 @@ +#include + #include "LKH.h" /* @@ -18,6 +20,9 @@ void WriteTour(char *FileName, int *Tour FILE *TourFile; int i, j, n, Forwards; char *FullFileName; + char *tmpbuf; + size_t tmplen; + int fdtmp; if (FileName == 0) return; @@ -27,7 +32,11 @@ void WriteTour(char *FileName, int *Tour FileName == TourFileName ? "TOUR_FILE" : FileName == OutputTourFileName ? "OUTPUT_TOUR_FILE" : "", FullFileName); - assert(TourFile = fopen(FullFileName, "w")); + tmplen = strlen(FullFileName) + 14; + assert(tmpbuf = malloc(tmplen)); + assert(snprintf(tmpbuf, tmplen, "%s.tmp.XXXXXX", FullFileName) < tmplen); + assert((fdtmp = mkstemp(tmpbuf)) != -1); + assert(TourFile = fdopen(fdtmp, "w")); fprintf(TourFile, "NAME : %s." GainFormat ".tour\n", Name, Cost); fprintf(TourFile, "COMMENT : Length = " GainFormat "\n", Cost); fprintf(TourFile, "COMMENT : Found by LKH [Keld Helsgaun]\n"); @@ -47,10 +56,14 @@ void WriteTour(char *FileName, int *Tour i = n; } fprintf(TourFile, "-1\nEOF\n"); - fclose(TourFile); + assert(fflush(TourFile) == 0); + assert(fsync(fileno(TourFile)) == 0); + assert(fclose(TourFile) == 0); + assert(rename(tmpbuf, FullFileName) == 0); if (TraceLevel >= 1) printff("done\n"); free(FullFileName); + free(tmpbuf); } /*