65.9K
CodeProject is changing. Read more.
Home

Simple File Reader and Writer Program in C

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.16/5 (13 votes)

Nov 14, 2007

3 min read

viewsIcon

44800

downloadIcon

595

A program for reading writing and finding records in a file.

Introduction

In C, everything from an on-disc file to a printer is a file. In this program I will explain how to navigate in a given file and find required data according to various categories.

Opening a File

C communicates with files using a new datatype called a file pointer. This type is defined within stdio.h, and written as FILE *.

FILE *fp; /* create a pointer to the file */
i = 0;

/* open the file*/
if((fp = fopen(FILE_NAME, "r")) == NULL)
{
perror("Could not open the file."); 
exit(1);
} 
  • r - open a file in read-mode, set the pointer to the beginning of the file.
  • w - open a file in write-mode, set the pointer to the beginning of the file.
  • a - open a file in write-mode, set the pointer to the end of the file.
  • rb - open a binary-file in read-mode, set the pointer to the beginning of the file.
  • wb - open a binary-file in write-mode, set the pointer to the beginning of the file.
  • ab - open a binary-file in write-mode, set the pointer to the end of the file.
  • r+ - open a file in read/write-mode, if the file does not exist, it will not be created.
  • w+ - open a file in read/write-mode, set the pointer to the beginning of the file.
  • a+ - open a file in read/append mode.
  • r+b - open a binary-file in read/write-mode, if the file does not exist, it will not be created.
  • w+b - open a binary-file in read/write-mode, set the pointer to the beginning of the file.
  • a+b - open a binary-file in read/append mode.



The maximum number of files that can be opened simultaneously is defined as FOPEN_MAX.

Closing a File

Closing a file is done using the fclose() function, which is defined as int fclose(FILE *fp);.

  fclose(fp); /* close the file*/
    


Writing to a File

Writing to files can be done in various ways:

  • putc() - like fputc()
  • fputc() - int fputc (int character, FILE * stream); - write a character to a file
  • fputs() - int fputs (const char * string , FILE * stream); - write a string to a file
  • fprintf()- int fprintf (FILE * stream , const char * format [ , argument , ...] ); - works like printf() except that it writes to a file instead of
  • STDOUT.


just like reading from files:

  • getc() - like fgetc()
  • fgetc() - int fgetc (FILE * stream); - write a character to a file
  • fgets() - char * fgets (char * string , int num , FILE * stream); - write a string to a file
  • fscanf() - int fscanf ( FILE * stream , const char * format [ , argument , ...] ); - works like scanf() except that it reads from a file instead of STDIN


Menu

The menu will provide options for you to select from. I included the menu in a function called menu() which returns selection. this function runs in a loop untill user exits it. The selection will be handles in a switch statement and corresponding function will be executed.

int menu()
{
char option[256];
int selection;

/*print the menu*/
puts("\nMining Survey Menu");
puts("\n1. Find/Display records for a given Date"); 
puts("2. Find/Display records equal or greater to given Reading value");
puts("3. Find/Display records for a given Rating. "); 
puts("4. Quit"); 
printf("\nSelect option: "); 
scanf("%s", option);

/*grab the selection*/
selection = atoi(option);

return selection;
}

Selecting records to show

The data read from the file will be stored in a structure. ShowRecords functions will reference that structure to print out the results.

/*show records by reading*/
void show_records_by_rating(const char* rating, struct record* data)
{
int found = 0;
int i;
int data_rating = atoi(rating);
struct record struct_result[FILE_SIZE];

printf("\n"); 
for(i = 0; i< struct_size; i++)
{
if(data[i].rating == data_rating)
{
printf("%s %s %f %d\n", data[i].site, data[i].date, 
data[i].reading, data[i].rating ); 
strcpy(struct_result[i].site, data[i].site);
strcpy(struct_result[i].date, data[i].date);
struct_result[i].reading = data[i].reading;
struct_result[i].rating = data[i].rating;

found++; 
}
}

save_results(found, struct_result);
}

Saving Results

The viewed results could be saved by specifying a file name. The results will be written to the disk using sprintf function.

void save_results(int found, struct record *data)
{
char res;
char response;
char file_name;
char line;
int i;

FILE *fp;

(found>0) ? printf("%d records found.\n", found) : printf("No records found\n"); 
if(found>0)
{
printf("\nSave the records? [Y/N]");
scanf("%s", response);
res = toupper(response[0]);
if(res == 'Y') 
{
printf("\nEnter the file name : ");
scanf("%s", file_name);
fp = fopen ( file_name , "a" );

for(i = 1; i< found+1; i++)
{
sprintf(line, "%s %s %f %d\n", data[i].site, data[i].date, 
data[i].reading, data[i].rating);
fprintf(fp, line, file_name);
}
fclose (fp);
} 
}
}

Points of Interest

Reading and writing files in C is not as easy as higher level languages like Java or C# where they provide specialised methods but C compiler generates efficient code for unmanaged Win32 or UNIX environment.

History

  • Created: November 15, 2007