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;
i = 0;
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);
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;
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);
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.
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<BUFF_SIZE>;
char file_name<BUFF_SIZE>;
char line<BUFF_SIZE>;
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