// FILE_IO.C // File input/output functions // © 2021 Peter J. Meyer #include "iss.h" #include <io.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> // input_filepath[] got from read_command_line(). /*-----------------------*/ void set_up_filenames(void) { strcpy(output_filepath,input_filepath); strcpy(strrchr(output_filepath,'.'),".OUT"); strcpy(map_filepath,input_filepath); strcpy(strrchr(map_filepath,'.'),".MAP"); #if SAVE_MEASUREMENTS strcpy(measurements_filepath,input_filepath); strcpy(strrchr(measurements_filepath,'.'),".MEA"); #endif #if CHECK_ADMISSABILITY _strdate(temp2); expired = ( atoi(&temp2[6]) ); // Version 1.93 expires on 2001-01-01. // 'expired' used in DSTARTUP.C and in MEAS.C. #endif } /*----------------------------------*/ void check_if_output_file_exists(void) { int ch; FILE *of; if ( file_exists(output_filepath) ) { if ( memcmp(output_filepath,"ISING",5) != 0 && memcmp(output_filepath,"POTTS",5) != 0 && memcmp(output_filepath,"BONDPERC",8) != 0 && memcmp(output_filepath,"SITEPERC",8) != 0 && memcmp(output_filepath,"SW",2) != 0 && memcmp(output_filepath,"WO",2) != 0 ) { printf("\nOutput file %s already exists.",output_filepath); printf("\nOverwrite existing file? (Y|N) "); ch = getche(); printf("\n"); if ( ! ( ch == 'Y' || ch == 'y' ) ) exit(0); } } while ( !open_file(output_filepath,"wt",&of) ) // If file exists then this truncates it. { printf("\n\aCannot open output file %s.",output_filepath); printf("\nPerhaps this file is already open? Retry or quit? (R|Q) "); ch = getche(); if ( ch == 'Q' || ch == 'q' ) exit(1); printf("\n"); } fclose(of); } // Returns true if file opened successfully, false otherwise. /*-------------------------*/ int open_file(char *filename, char *mode, // e.g. "rt", "wt" FILE **file) { *file = fopen(filename,mode); return ( *file != NULL ); } /*---------------------------*/ int read_line(FILE *input_file) { char *ptr; // fgets() reads at most sizeof(line)-1 bytes // and keeps the final LINEFEED if found. if ( fgets(line,sizeof(line),input_file) == NULL ) return ( false ); if ( ( ptr = strchr(line,LINEFEED) ) != NULL ) *ptr = 0; // Remove final line feed remove_outer_spaces(line); _strlwr(line); return ( true ); } /*---------------------------*/ int file_exists(char *filepath) { FILE *f; f = fopen(filepath,"rt"); if ( f == NULL ) return ( false ); fclose(f); return ( true ); } #if false // Not used. // Save measurements to .MEA file. // Low-level file I/O is used. /*-----------------------*/ int save_measurements(void) { int fh; int nmc=NUM_MAGNETIZATION_COMPONENTS; int niec=NUM_INTERNAL_ENERGY_COMPONENTS; int nac=NUM_AUTOCORRELATION_COMPONENTS; int measurements_bytes_written; if ( ( fh = _open(measurements_filepath,_O_WRONLY|_O_CREAT|_O_TRUNC, _S_IREAD|_S_IWRITE ) ) == -1 ) display_file_error_message("open (for writing)", "measurements",measurements_filepath); // Does not return. _write(fh,&num_time_slices,sizeof(int)); _write(fh,&internal_energy_measured,sizeof(int)); _write(fh,&second_moment_measured,sizeof(int)); _write(fh,&model_is_q_state_potts,sizeof(int)); _write(fh,&q,sizeof(int)); _write(fh,&nmc,sizeof(int)); _write(fh,&niec,sizeof(int)); _write(fh,&nac,sizeof(int)); _write(fh,&num_spins,sizeof(int)); measurements_bytes_written = 9*sizeof(int); _write(fh,&num_samples,sizeof(double)); _write(fh,&temperature,sizeof(double)); measurements_bytes_written += sizeof(double); if ( ( measurements_bytes_written += _write(fh,&magnetization[0][0], sizeof(double)*(num_time_slices+1)*NUM_MAGNETIZATION_COMPONENTS)) == -1 ) display_file_error_message("write measurements to", "measurements",measurements_filepath); if ( internal_energy_measured ) if ( ( measurements_bytes_written += _write(fh,&internal_energy[0][0], sizeof(double)*(num_time_slices+1)*NUM_INTERNAL_ENERGY_COMPONENTS)) == -1 ) display_file_error_message("write measurements to", "measurements",measurements_filepath); if ( second_moment_measured && model_is_q_state_potts ) if ( ( measurements_bytes_written += _write(fh,&potts_magnetization_squares[0][0], sizeof(double)*(num_time_slices+1)*(q+1))) == -1 ) display_file_error_message("write measurements to", "measurements",measurements_filepath); if ( autocorrelation_measured ) if ( ( measurements_bytes_written += _write(fh,&autocorrelation[0][0], sizeof(double)*(num_time_slices+1)*NUM_AUTOCORRELATION_COMPONENTS)) == -1 ) display_file_error_message("write measurements to", "measurements",measurements_filepath); _close( fh ); return ( measurements_bytes_written ); } #endif