I'm trying to create a function that will sort the contents of a file in alphabetical order. The problem I'm having is that the code doesn't seem to do anything. The only examples I could find have to do with arrays which I am not using but I tried to apply the same principle to structs and files. The file I need to sort is a log file and the size of it's contents will be forever increasing. Here's the ineffective code:

NB: Basically I'm trying to display a report sorted alphabetically. If there's a simple way that doesn't involve modifying the file that would be great.

void insertion_sort(int category)
{
	FILE *seeker;
   int size=0, total=0, runner=0;
   int k;
   int i;
   ADMISSION_DATA small = {NULL,NULL,"","","",0,999,0.00,1,0};
   ADMISSION_DATA temp = {NULL,NULL,"","","",0,999,0.00,1,0};

   if( (seeker = fopen("guest_history.txt", "rb+")) == NULL )
   {
   	printf("\nGuest history file could not be opened");
   	_getch();
   }
   else
   {
      // counts the number of cancellations in the file
      while ( fread( &section, sizeof (ADMISSION_DATA), 1, seeker ) == 1 )
      {
         total++;
      	if( section.cancel == category )
         	size++;

      }
      rewind( seeker );
      //printf("Count: %d", size); _getch(); size = 0;

      while ( fread( &section, sizeof (ADMISSION_DATA), 1, seeker ) == 1 )
      {
      	if( section.cancel == category )
         {
      		for (k = 1; k < size; k++)
      		{
      			// sets the first row as the smallest
      			//fseek( seeker, ( section.reservation_num - k ) * sizeof( ADMISSION_DATA ), SEEK_SET );
      			fread( &small, sizeof (ADMISSION_DATA), 1, seeker );
      			//rewind( seeker );

         		for(i = k - 1; i>=0 && (strcmp(small.first_name,section.first_name) < 0); i--)
         		{
         			//fseek( seeker, ( section.reservation_num - i ) * sizeof( ADMISSION_DATA ), SEEK_SET );
            		//fread( &section, sizeof( ADMISSION_DATA ), 1, seeker );
            		temp = section;
                  fseek( seeker, ( section.reservation_num ) * sizeof( ADMISSION_DATA ), SEEK_SET );
                  fwrite( &temp, sizeof( ADMISSION_DATA ), 1, seeker );
               }

               //fseek( seeker, ( section.reservation_num ) * sizeof( ADMISSION_DATA ), SEEK_SET );
               //fread( &small, sizeof( ADMISSION_DATA ), 1, seeker );
               temp = small;
               fseek( seeker, ( section.reservation_num ) * sizeof( ADMISSION_DATA ), SEEK_SET );
               fwrite( &small, sizeof( ADMISSION_DATA ), 1, seeker );
            }
         }
         runner++;
      }
   }
   fclose( seeker );
   //printf("RUN %d", runner);
}

I doubt I can use the reservation number to navigate through the files because more than one row can have the same number (1 - 50).

Recommended Answers

All 3 Replies

Between every fwrite() and fread() call, there should be a fflush() call.

I hope this is limited to a small number of unsorted records at the end of the file, because this approach is going to take some time.

I recoded my insertion sort function. With almost a full day between my first post it now works but it doesn't work perfectly. The issue is that the sorting function will partially sort the guest names and display the report. For example, if I have


Unsorted Data

Alice
Zebra
Cat
Apple

Clicks the report function once

Cat
Apple
Alice
Zebra


Clicks the report function a second time

Alice
Apple
Cat
Zebra

Why isn't the data being sorted correctly sorted the first time the report is displayed and how do I get it only display when the list is fully sorted?

/* +++++++++INSERTION SORT FUNCTION +++++++++++ */
void insertion_sort()
{
	FILE *guest_Ptr;
   int size=0;
   int outer_run;
   int inner_run;

   ADMISSION_DATA small = {NULL,NULL,"","","",0,999,0.00,1,0};


   if( (guest_Ptr = fopen("guest_history.txt", "rb+")) == NULL )
   {
   	textcolor(12); cprintf("\nERROR!! HISTORY FILE COULD NOT BE OPENED!"); sleep(3);
   }
   else
   {
      // counts the number of guest records in the file
      while ( fread( &section, sizeof (ADMISSION_DATA), 1, guest_Ptr ) == 1 )
      {
      	size++;
      }

      rewind( guest_Ptr );
      //printf("Count: %d", size); _getch();

      for(outer_run = 1; outer_run < size; outer_run++)
      {
      	fseek( guest_Ptr, ( outer_run ) * sizeof( ADMISSION_DATA ), SEEK_SET );
         fread( &section, sizeof( ADMISSION_DATA ), 1, guest_Ptr );
         small = section;

         rewind ( guest_Ptr );

         inner_run = outer_run - 1;

         fseek( guest_Ptr, ( inner_run ) * sizeof( ADMISSION_DATA ), SEEK_SET );
         fread( &section, sizeof( ADMISSION_DATA ), 1, guest_Ptr );
         rewind ( guest_Ptr );

         for(; inner_run >= 0 && (strcmp( small.first_name, section.first_name) <= 0 ); inner_run--)
         {
         	fseek( guest_Ptr, ( inner_run ) * sizeof( ADMISSION_DATA ), SEEK_SET );
            fread( &section, sizeof( ADMISSION_DATA ), 1, guest_Ptr );

            fseek( guest_Ptr, ( inner_run + 1 ) * sizeof( ADMISSION_DATA ), SEEK_SET );
            fwrite( &section, sizeof( ADMISSION_DATA ), 1, guest_Ptr );
         }

         fseek( guest_Ptr, ( inner_run + 1 ) * sizeof( ADMISSION_DATA ), SEEK_SET );
         fwrite( &small, sizeof( ADMISSION_DATA ), 1, guest_Ptr );
      }
   }
   fclose( guest_Ptr );
} // Control is returned to the report function

No worries, I solved the problem.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.