C File Handling: I/O Functions Guide
C File Handling: I/O Functions Guide
Background
• Console oriented I/O functions use keyboard as
  input device and monitor as output device.
• The I/O functions like printf(), scanf(), getchar(),
  putchar(), gets(), puts()
• Problem:
  1. Entire data is lost when either the program is
     terminated or the computer is turned off.
  2. When the volume of data to be entered is large, it
     takes a lot of time to enter the data.
  3. If user makes a mistake while entering data, whole
     data has to be re-entered.
• Solution: File
                                                      2
             Concept of file
• File
  is a place on the disk (not memory) where a
  group of related data is stored. Also called
  data files.
• The Data File
  allows us to store information permanently
  and to access and alter that information
  whenever necessary.
                                             3
 Classification of disk/file I/O functions
                                    Disk I/O Functions
High-level Low-level
Text Binary
                                                                           4
Some high-level I/O functions
Function name                             Operation
   fopen()      •Creates a new file for use
                •Opens an existing file for use
   fclose()     •Closes a file which was opened for use
   fgetc()      •Reads a character from a file
                                                                             5
       Defining and Opening a file
• The general format for declaring and opening a file is:
             FILE *fp;
             fp=fopen(“filename”, “mode”);
• Here, the first statement declares the variable fp as a
  “pointer to the data type FILE”.
• The second statement opens the file named filename
  with the purpose mode and the beginning address of the
  buffer area allocated for the file is stored by file pointer
  fp.
• Note: Any no. of files can be opened and used at a time.
                                                             6
             File Opening Modes
                                          7
                    Closing a file
• The closing a file ensures that all outstanding
  information associated with the file is flushed out from
  the buffers and all links to the file are broken.
• In cases where there is a limit to the no. of files that can
  be kept open simultaneously, closing of unwanted files
  help in opening the required ones.
• Another instance where we have to close a file is when
  we want to reopen the same file in different mode.
• The file is closed using library function fclose() as:
             fclose(fp);
                                                             8
   Library Functions for Reading/Writing
      from/to a File: File I/O Functions
• Once a file is opened, reading out of or writing
  to it is accomplished using the standard I/O
  functions.
                                                 9
    String Input/Output Functions
• Using string I/O functions fgets() and fputs(),
  data can be read from a file or written to a file
  in the form of array of characters.
  i. fgets(): is used to read string from file.
      Syntax:        fgets(string, int_value, fp);
       Here, int_value denotes the no. of characters in the string.
  ii. fputs(): is used to write string to file.
      Syntax:       fputs(string, fp);
                                                                      10
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp;
clrscr();
fp=fopen("D:\\test.txt", "w");
if(fp==NULL)
     {
            printf("\n Cannot create file.");
            exit(0);
     }
else
     {
            printf("\n File is created.");
     }
fputs("I study CSIT", fp);
fclose(fp);
getch();
}
                                                11
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp;
char s[100];
clrscr();
fp=fopen("D:test.txt", "r");
if(fp==NULL)
      {
      printf("\n Cannot open file.");
      exit(0);
      }
else
      {
      printf("\nFile is opened.");
      }
fgets(s,19,fp);
fclose(fp);
getch();
}
                                        12
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp;
clrscr();
fp=fopen("D:\\test.txt", "a");
if(fp==NULL)
     {
     printf("\n Cannot open file.");
     exit(1);
     }
else
     {
     printf("\n File is opened.");
     }
fputs(“in CAB", fp);
fclose(fp);
getch();
}
                                       13
                                       Naming a file
void main()
{
FILE *fp;
char filename[20];
clrscr();
printf("Enter filename:\t");
gets(filename);
fp=fopen(filename, "w");
if(fp==NULL)
       {
       printf("\n Cannot create file.");
       exit(1);
       }
else
       {
       printf("\n File is created.");
       }
getch();
}
// If only filename is given, file is created in C:\TC\BIN otherwise file is created in the given path.
                                                                                                          14
        Character I/O Functions
• Using character I/O functions fgetc() and
  fputc(), data can be read from file or written
  onto file one character at a time.
  i. fgetc(): is used to read a character from a file.
      Syntax:
      char_variable=fgetc(fp);
  ii. fputc(): is used to write a character to a file.
      Syntax:
      fputc(‘character’or character_variable, fp);
                                                         15
void main()
{
FILE *fp;
char filename[20];
char c;
clrscr();
printf("Enter filename:\t");
gets(filename);
fp=fopen(filename,"w");
if(fp==NULL)
    {
    printf("\n Cannot create file.");
    exit();
    }
else
    printf("\n File is created.");
printf("\n Enter your text until Enter key:\n");
while((c=getchar())!='\n')
    fputc(c,fp);
fclose(fp);
getch();
}                                                  16
void main()
{
FILE *fp;
char filename[20];
char c;
clrscr();
printf("Enter filename:\t");
gets(filename);
fp=fopen(filename, "r");
if(fp==NULL)
     {
     printf("\n Cannot open file.");
     exit();
     }
                                          17
              End-Of-File (EOF)
• EOF is a special character (an integer with ASCII
  value 26) that indicates that the end-of-file has
  been reached. This character can be generated
  from the keyboard by typing Ctrl+Z.
• Defined in <stdio.h>
• When we are creating a file, the special character
  EOF, is inserted after the last character of the file
  by the Operating System.
• Caution: An attempt to read after EOF might
  either cause the program to terminate with an
  error or result in an infinite loop situation.
                                                     18
void main()
{
FILE *fp;
char filename[20];
char c;
clrscr();
printf("Enter filename:\t");
gets(filename);
fp=fopen(filename,"a");
if(fp==NULL)
     {
     printf("\n Cannot create or open file.");
     exit();
     }
printf("\nEnter text to append to file %s:\n", filename);
while((c=getchar())!='\n')
     fputc(c,fp);
fclose(fp);
getch();
}
                                                            19
void main()                           dfp=fopen(dfilename, "w");
{                                     if(dfp==NULL)
FILE *sfp,*dfp;                           {
char sfilename[20],dfilename[20];         printf("\n Destination file cannot
char c;                                   be created or opened.");
clrscr();                                 exit();
printf("Enter source filename:\t");       }
gets(sfilename);                      while((c=fgetc(sfp))!=EOF)
printf("\n Enter destination              fputc(c, dfp);
    filename:\t");                    printf("\n Copied........");
gets(dfilename);                      fclose(dfp);
sfp=fopen(sfilename,"r");             fclose(sfp);
if(sfp==NULL)                         getch();
    {                                 }
    printf("\nSource file can't be
    opened.");
    exit();
    }
                                                                           20
                Question
• Given a text file, create another text file
  deleting all the vowels (a, e, i, o, u).
                                            21
void main()                             }
{
FILE *fp,*fpp;                      while((c=fgetc(fp))!=EOF)
char c;                             {
fp=fopen("C:\\test.txt","r+");
clrscr();                               if((c!='a')&&(c!='e')&&(c!='i')&&(
if(fp==NULL)                            c!='o')&&(c!='u'))
    {                                   fputc(c, fpp);
    printf("Cannot open file");
    exit();                         }
    }
fpp=fopen("C:\\hello.txt","w");     fclose(fp);
if(fpp==NULL)                       fclose(fpp);
    {                               getch();
    printf("Cannot create file");   }
    exit();
                                                                      22
        Formatted I/O Functions
• Using formatted I/O functions, fprintf() and
  fscanf(), numbers, characters or string can be read
  from file or written onto file according to our
  requirement format.
  i.   fprintf(): is formatted output function which is used to
       write integer, float, char or string value to a file.
       Syntax:
        fprintf(fp, “control_string”, list_of_variables);
  ii. fscanf(): is formatted input function which is used to
       read integer, float, char or string value from a file.
       Syntax:
       fscanf(fp, “control_string”, &list_of_variables);
                                                             23
void main()
{
FILE *fp;
char name[20];
int roll;
char address[20];
float marks;
clrscr();
fp=fopen("C:\\student.txt", "w");
if(fp==NULL)
    {
    printf("\n File cannot be created or opened.");
    exit();
    }
                                                      24
printf("\n Enter name of student:\t");
gets(name);
printf("\n Enter roll number of %s:\t", name);
scanf("%d", &roll);
fflush(stdin);
printf("\n Enter address of %s:\t", name);
gets(address);
printf("\n Enter marks of %s:\t", name);
scanf("%f", &marks);
printf("\n Now writing data to file...");
fprintf(fp, "Name=%s\n Roll=%d\n Address=%s\n Marks=%.2f",
    name, roll, address, marks);
printf("\n Completed");
fclose(fp);
getch();
}
                                                         25
                 Use of fflush()
• Here, after providing name of student, we would hit
  enter key……No Problem……and then we provide roll
  of      student……and        hit     the     enter    key
  again…...Problem…...
• At this time the enter key which is in the keyboard
  buffer is read by the gets()/scanf() function for address
  (as enter key is a character, \n), so that we are able to
  fill only the marks.
• To avoid this problem, we use the function fflush().
• It is designed to remove or flush out any data remaining
  in the buffer.
                                                         26
                Question
• Define a structure for Vehicle Owner having
  data members name, address, telephone
  number, vehicle number and license
  number. Take the data for ten owners, write
  them in file “Own.txt”. Read the data from
  the file and display them.
                                            27
struct vehicle_owner
    {
    char name[20];
    char address[20];
    long int phone_no;
    int vehicle_no;
    int license_no;
    };
void main()
{
FILE *fp;
struct vehicle_owner vehicle[10], v[10];
int i;
clrscr();
fp=fopen("C:\\Own.txt","w");
if(fp==NULL)
    {
    printf("\nCannot create file.");
    exit();
    }
                                           28
for(i=0;i<SIZE;i++)
    {
    printf("\n Enter information about vehicle owner %d",i+1);
    printf("\n Enter name :\t");
    gets(vehicle[i].name);
                                                                              29
fclose(fp);
fp=fopen("C:\\Own.txt","r");
for(i=0;i<10;i++)
{
fscanf(fp,"%s %s %ld %d
    %d",&v[i].name,&v[i].address,&v[i].phone_no,&v[i].vehicle_no,&v[i].license_
    no);
printf("%s\t%s\t%ld\t%d\t%d\n",v[i].name,v[i].address,v[i].phone_no,v[i].vehicl
    e_no,v[i].license_no);
}
fclose(fp);
getch();
}
                 Problem
• Given a text file, create another text file
  deleting the following words “three”, “bad”,
  and “time”.
                                             31
#include <stdio.h>
void main()
{
FILE *fp,*fpp;
char c[10];
fp=fopen("C:\\test.txt",“r");
clrscr();
if(fp==NULL)
       {
       printf("Cannot open file");
       exit();
       }
fpp=fopen("C:\\hello.txt","w");
if(fpp==NULL)
       {
       printf("Cannot create file");
       exit();
       }
while(fscanf(fp,"%s",c)!=EOF)
 {
 if((strcmp(c,"three")!=0)&&(strcmp(c,"bad")!=0)&&(strcmp(c,"time")!=0))
       {
       fprintf(fpp,"%s ",c);
       }
 }
fclose(fp);
fclose(fpp);
getch();
}
                                                                           32
                 Problem
• Some text file is given, create another text
  file replacing the following words “Ram” to
  “Hari”, “Sita” to “Gita”, and “Govinda” to
  “Shiva”.
                                             33
#include <stdio.h>                  while(fscanf(fp,"%s",c)!=EOF)
void main()                         {
{                                   if(strcmp(c, "Ram")==0)
FILE *fp,*fpp;                         fprintf(fpp, "Hari ",c);
char c[10];
fp=fopen("C:\\test.txt","r");       else if(strcmp(c, "Sita")==0)
clrscr();                              fprintf(fpp,"Gita",c);
if(fp==NULL)
    {                                else if(strcmp(c, "Govinda")==0)
    printf("Cannot open file");         fprintf(fpp, "Shiva",c);
    exit();                          else
    }                                   fprintf(fpp,"%s ",c);
fpp=fopen("C:\\hello.txt","w");      }
if(fpp==NULL)                       fclose(fp);
    {                               fclose(fpp);
    printf("Cannot create file");   getch();
    exit();                         }
    }
                                                                        34
                 Question
• Create a program to create a data file and
  write the integers from 1 to 20 to this file
  and then read the numbers from the file to
  display the squares of the stored numbers.
                                             35
#include <stdio.h>
void main()
{
FILE *fp;
register unsigned int i;
unsigned filedata;
clrscr();
fp=fopen("C:\\data.txt","w");
if(fp==NULL)
     {
     printf("\nCannot create data file.");
     exit();
     }
for(i=1;i<21;i++)
     {
     fprintf(fp,"%u\t",i);
     }
fclose(fp);
fp=fopen("C:\\data.txt","r");
printf("\nThe squares of the stored numbers are:\t");
for(i=1;i<21;i++)
     {
     fscanf(fp,"%u",&filedata);
     filedata=filedata*filedata;
     printf("%u\t", filedata);
     }
getch();
}
                                                        36
                Question
• A file named DATA contains a series of
  integer numbers. Code a program to read
  these numbers and then write all odd
  numbers to a file to be called ODD and all
  even numbers to a file to be called EVEN.
                                           37
#include <stdio.h>
void main()
{
FILE *fpdata;
FILE *fpodd;
FILE *fpeven;
int i,n;
int num;
clrscr();
printf("\nHow many integers you want in data file?:\t");
scanf("%d",&n);
printf("\nEnter %d integers:\t",n);
fpdata=fopen("C:\\DATA.txt","w");
for(i=0;i<n;i++)
     {
     scanf("%d",&num);
     fprintf(fpdata,"%d\n",num);
     }
fclose(fpdata);
fpdata=fopen("C:\\DATA.txt","r");
fpodd=fopen("C:\\ODD.txt","w");
fpeven=fopen("C:\\EVEN.txt","w");
                                                           38
for(i=0;i<n;i++)
   {
   fscanf(fpdata,"%d", &num);
      if(num%2==0)
      fprintf(fpeven,"%d\t", num);
      else
      fprintf(fpodd,"%d\t", num);
  }
fclose(fpdata);
fclose(fpodd);
fclose(fpeven);
getch();
}
                                     39
Error situations during I/O operations
• Trying to read beyond the end-of-file mark.
• Trying to use a file that has not been opened.
• Trying to perform an operation on a file, when
  the file is opened for another type of operation.
• Opening a file with an invalid filename.
                                                  40
         Error handling functions
• I/O errors can be detected using two status-inquiry
  library functions: feof() and ferror().
• feof(): It is used to test for an end-of-file condition. It
  takes a FILE pointer as its only argument and returns a
  nonzero integer value if all of the data from the
  specified file has been read, and returns zero otherwise.
  If fp is a pointer to a file that has just been opened for
  reading, then the statement
               if(feof(fp))
                      printf(“End of data”);
  would display the message “End of data” on reaching
  the end-of-file condition.
                                                           41
       Error handling functions…
• ferror(): This function reports the status of the file
  indicated. It takes a FILE pointer as its argument
  and returns a nonzero integer if an error has been
  detected up to that point, during processing. It
  returns zero otherwise. So the statement
      if(ferror(fp)!=0)
             printf(“An error has occurred”);
  would print the error message, if the reading is
  not successful.
                                                      42
void main()
{
FILE *fp1;
char *filename;
int i, num;
clrscr();
fp1=fopen("C:\\test.txt", "w");
for(i=10;i<=100;i += 10)
    {
    fprintf(fp1,"%d\t", i);
    }
fclose(fp1);
printf("\n Enter filename:\t");   //Type C:\test.txt
open_file:
    scanf("%s", filename);
                                                       43
if((fp1=fopen(filename,"r"))==NULL)
     {
     printf("\nAn error occured while opening the file.");
     printf("\nType filename again:\t");
     goto open_file;
     }
else
     for(i=1;i<=20;i++)
     {
     fscanf(fp1,"%d", &num);
     if(feof(fp1))
            {
            printf("\nRan out of data.");
            break;
            }
     else
            printf("%d\n", num);
     }
fclose(fp1);
getch();
}
                                                             44
void main()
{
  FILE *fp;
  int num;
  clrscr();
  fp = fopen("DUMMY.FIL", "w");
  /* force an error condition by attempting to read */
  fscanf(fp,"%d", &num);
  if (ferror(fp)!=0)
     {
     printf("Error reading from DUMMY.FIL\n");
     }
  fclose(fp);
  getch();
}
                                                         45
                 Binary Data Files
• The binary files organize data into blocks
  containing contiguous bytes of information.
• In binary file, the opening mode of text file is
  appended by a character b i.e.
  i.     “r” is replaced by “rb”
  ii.    “w” is replaced by “wb”
  iii.   “a” is replaced by “ab”     Note: For text mode we can write
                                     “rt” in place of “r”, “wt” in place of
  iv.    “r+” is replaced by “r+b”   “w”and so on. However, it is
                                     unnessary because default mode is
  v.     “w+” is replaced by “w+b”   text mode
                                                                        46
void main()
{
FILE *fp;
char c;
clrscr();
fp=fopen("C:\\test.txt","w+b");
if(fp==NULL)
   {
   printf("\nCannot create file.");
   exit();
   }
fputs("I study B.Sc. CSIT", fp);
fclose(fp);
getch();
}
                                      47
So, what’s the difference between text
mode and binary mode and which mode to
use???
• Analyze with 3 factors:
  I. How newlines (\n) are stored?
  II. How end-of-file is indicated?
  III. How numbers are stored in the file?
                                             48
/*Count no. of characters, spaces,     if(c==EOF)
    and newlines in a file*/                 break;
void main()                            noc++;
{                                      if(c==' ')
FILE *fp;                                    nos++;
char text[100];                        if(c=='\n')
char c;                                      nol++;
int noc=0,nos=0,nol=0;                 }
fp=fopen("C:\\poem.txt", "r");      fclose(fp);
if(fp==NULL)                        printf("\n No. of characters:%d",
    {                                  noc);
    printf("\nCannot create or open printf("\n No. of spaces:%d", nos);
    file.");                        printf("\n No. of lines:%d", nol);
    exit();                         getch();
    }                               }
while(1)
    {
    c=fgetc(fp);
                                                                  49
     The poem.txt file contains:
Johnny Johnny     So output is:
                  No. of characters=87
Yes Papa          No. of spaces=8
                  No. of lines=7
Eating Sugar      which is correct.
No Papa
Telling Lies       Now, go to DOS shell and use the
                   DIR command in C-drive to view the
No Papa            no. of characters (bytes) that the file
                   poem.txt occupies which is 94.
Open Your Mouth
hahaha
                                                             50
                   First factor
• In text mode, a newline character is converted into the
  carriage return-linefeed combination before being
  written to disk.
• Likewise, the carriage return-linefeed combination on
  the disk is converted back into a newline when the file
  is read by a C program.
• However, if a file is opened in binary mode, as opposed
  to text mode, these conversions do not take place.
• In binary mode, each end of line is signified by a
  carriage return-linefeed combination and is counted as
  two characters in binary mode (similar to DIR
  command in DOS).
                                                       51
/*Count no. of characters, spaces,        c=fgetc(fp);
    and newlines in a file*/              if(c==EOF)
void main()                                     break;
{                                         noc++;
FILE *fp;                                 if(c==' ')
char text[100];                                 nos++;
char c;                                   if(c=='\n')
int noc=0,nos=0,nol=0;                          nol++;
fp=fopen("C:\\poem.txt", "rb");           }
if(fp==NULL)                          fclose(fp);
    {                                 printf("\n No. of characters:%d",
    printf("\nCannot create or open       noc);
    file.");                          printf("\n No. of spaces:%d", nos);
    exit();                           printf("\n No. of lines:%d", nol);
    }                                 getch();
while(1)                              }
    {
                                                                            52
              Second Factor
• In text mode, a special character EOF whose
  ASCII value is 26 is inserted after the last
  character in the file to mark the end of file.
• However, there is no such special character
  present in the binary mode files to mark the
  end of file.
• The binary mode files keep track of the end of
  file from the number of characters present in
  the directory entry of the file.
                                               53
                    Third Factor
• In text mode, the text and numbers are stored as string of
  characters such that the number 12345 will occupy 5 bytes
  (1 byte/character).
• Similarly 1234.56 occupies 7 bytes on disk in text mode.
• However, in binary mode the numbers are stored in the
  same way as they are stored in RAM so that the number
  12345 occupies only 2 bytes and 1234.56 occupies only 4
  bytes on disk in binary mode.
• Therefore, when large amount of numerical data is to be
  stored onto disk, binary mode is suitable by using functions
  fread() and fwrite() instead of fprintf() and fscanf().
                                                            54
Record I/O……Background Problems
• The character I/O and string I/O functions allow
  reading/writing of character data only, while the
  formatted I/O functions allow reading/writing of
  character data and numeric data both.
• Problem: Numbers are always stored as a
  sequence of characters using these I/O functions
  (irrespective of whether text mode or binary mode
  is being used), so that they occupy a lot of disk
  space.
                                                  55
• Another Problem: There is no direct way to read and write
  complex data types such as arrays and structures. Arrays
  and structures are handled by writing/reading one element
  at a time or using loops, but this approach is inefficient.
• Example:
 #include <stdio.h>                                while(another=='Y')
 void main()                                       {
 {                                                 printf("\nEnter name, age and basic salary");
 FILE *fp;                                         scanf("%s %d %f",e.name,&e.age,&e.salary);
 char another='Y';                                 fprintf(fp,"%s\t%d\t%f",e.name,e.age,e.salary);
 struct emp                                        printf("\nAdd another record(Y/N):\t");
             {                                     fflush(stdin);
             char name[40];                        another=getche();
             int age;                              }
             float salary;                         fclose(fp);
             };                                    getch();
 struct emp e;                                     }
 fp=fopen("c:\\emp.dat","wb");
 if(fp==NULL)                                        Here, if the no. of fields in the structure
             {                                       increase (say by adding address, house
             puts("Cannot create or open file");     rent allowance etc.), writing structures
             exit();                                 using fprintf(), or reading them using
             }
                                                     fscanf(), becomes quite clumsy.
                                                                                                   56
   Record Input/Output Functions
• Defined in <stdio.h>
• fwrite(): is used for record output.
Syntax:
fwrite(&p, size_of_array_or_structure,
  no._of_array_or_structure, fp);
                                         57
#include <stdio.h>                              printf("\n Enter name, age and basic salary:");
void main()                                     scanf("%s %d %f", e.name, &e.age,
{                                               &e.salary);
FILE *fp;                                       fwrite(&e,sizeof(e),1,fp);
char another='Y';                               printf("\n Add another record(Y/N):\t");
struct emp                                      fflush(stdin);
     {                                          another=getche();
     char name[40];                             }
     int age;                              fclose(fp);
     float salary;                         fp=fopen("c:\\emp.dat","rb");
     };                                    if(fp==NULL)
struct emp e;                                   {
clrscr();                                       puts("Cannot create or open file");
                                                exit();
fp=fopen("c:\\emp.dat","wb");                   }
if(fp==NULL)                               while(fread(&e,sizeof(e),1,fp)==1)
     {                                          {
     puts("Cannot create or open file");        printf("\n%s\t%d\t%f", e.name, e.age,
     exit();                                    e.salary);
     }                                          }
                                           fclose(fp);
while(another=='Y'||another=='y')          getch();
    {                                      }
                                                                                              58
#include <stdio.h>                                         e[i].salary=temp;
void main()                                                fflush(stdin);
{                                                          }
FILE *fp;                                             fwrite(&e,sizeof(e),2,fp);
struct emp                                            fclose(fp);
       {                                              fp=fopen("c:\\employee.dat","rb");
       char name[40];                                 if(fp==NULL)
       int age;                                            {
       float salary;                                       puts("Cannot open file");
       };                                                  exit();
struct emp e[2],ee[2];                                     }
int i;
float temp;                                           fread(&ee,sizeof(ee),2,fp)
clrscr();                                                  for(i=0;i<2;i++)
                                                           printf("\n%s\t%d\t%.2f", ee[i].name, ee[i].age,
fp=fopen("c:\\employee.dat","wb");                         ee[i].salary);
                                                      fclose(fp);
if(fp==NULL)                                          getch();
     {                                                }
     puts("Cannot create or open file");
     exit();
     }
for(i=0;i<2;i++)
     {
     printf("\nEnter name, age and basic salary:");
     scanf("%s %d %f",e[i].name,&e[i].age,&temp);
                                                                                                             59
    Random Access in a File (Direct Access)
• Till now, reading and writing data from/to a
  file has been done sequentially.
• But we may need to access a particular data
  item placed in any location without starting
  from the beginning.
• This is called random access or direct access.
                                               60
       Use of file pointer for random access…
• A file pointer is a pointer to a particular byte in a file.
• While opening a file in write mode, the file pointer is at the
  beginning of the file, and whenever we write to a file, the
  file pointer moves to the end of the data items written so
  that writing can continue from that point.
• While opening a file in read mode, the file pointer is at the
  beginning of the file, and whenever we read from a file, the
  file pointer moves to the beginning of the next data item so
  that reading cam continue from that point.
• While opening a file in append mode, the file pointer is at
  the end of the existing file, so that new data items can be
  written from there onwards.
• If we are able to move the file pointer according as our
  need, then any data item can be read from a file or written
  onto a file randomly…………Random Access
                                                              61
 Functions used in random access
1. ftell(): This function takes a file pointer as
   argument and returns a number of type long,
   that indicates the current position of the file
   pointer within the file. This function is useful
   in saving the current position of a file, which
   can be used later in the program.
    Syntax
           n = ftell(fp);
    Here, n would give the relative offset (in bytes) of
    the current position. This means that n bytes have
    already been read (or written).
                                                      62
    Functions used in random access
2. rewind():This function takes a file pointer as
   argument and resets the current position of the
   file pointer to the start of the file.
    Syntax:              rewind(fp);
    What these statements do?:      rewind(fp);
                                     n=ftell(fp);
•    Here, n would be assigned 0, because file
     position has been set to the start of the file by
     rewind().
•    Note: The first byte in the file is numbered as 0,
     second as 1, and so on.
                                                     63
Functions used in random access…
3. fseek(): This function is used to move the file pointer
   to a desired position within a file.
   Syntax
     fseek(fp, offset, position);
   where fp is a file pointer, offset is a number or
   variable data type long, and position is an integer
   number
• The offset specifies the number of positions (bytes) to
   be moved from the location specified by position.
• The position can have one of the following 3 values:
                    Value Meaning
                    0     Beginning of file
                    1     Current position
                    2     End of file
                                                        64
                          fseek()…
• The offset may be positive, meaning move
  forwards, or negative, meaning move backwards.
• Examples:
     Statement                                 Meaning
  fseek(fp, 0L, 0);   Move file pointer to beginning of file. (Same as rewind.)
  fseek(fp, 0L, 1);    Stay at the current position. (File pointer is not moved.)
  fseek(fp, 0L, 2);   Move file pointer past the last character of the file. (Go to
                                           the end of file.)
  fseek(fp, m, 0);           Move file pointer to (m+1)th byte in the file.
  fseek(fp, m, 1);             Move file pointer forwards by m bytes.
  fseek(fp, -m, 1);   Move file pointer backwards by m bytes from the current
                                             position.
  fseek(fp, -m, 2);     Move file pointer backwards by m bytes from the end.
                       (Positions the file pointer to the mth character from65the
                                                  end.)
                     fseek()…
• When the operation is successful, fseek()
  returns a 0 (zero).
• If we attempt to move the file pointer beyond
  the file boundaries, an error occurs and fseek()
  returns -1 (minus one).
• It is good practice to check whether an error
  has occurred or not, before proceeding further.
                                                 66
       /* A program that uses the functions ftell() and fseek() */
#include <stdio.h>                                          printf("\nCannot create file.");
void main()                                                 exit();
{                                                           }
FILE *fp;                                              n=0L;
char c;                                                while(feof(fp)==0)
long n;                                                     {
clrscr();                                                   fseek(fp,n,0); //Position to (n+1)th character
fp=fopen("RANDOM","w");                                     printf("Position of %c is %ld\n",fgetc(fp),ftell(fp));
if(fp==NULL)                                                n=n+5L;
      {                                                     }
      printf("\nCannot create file.");                 putchar('\n');
      exit();
      }                                                fseek(fp,-1L,2); /*Position to the last character*/
while((c=getchar())!=EOF)                                   do
     fputc(c,fp);                                           {
printf("\nNo. of characters entered=%ld",ftell(fp));        putchar(fgetc(fp));
                                                            }while(!fseek(fp,-2L,1));
fclose(fp);                                            fclose(fp);
fp=fopen("RANDOM","r");                                getch();
if(fp==NULL)                                           }
     {
                                                                                                                67
                  Explanation
• A file called RANDOM is created with the
  following contents:
Stored Character:      A B C     … Z
File Pointer Position: 0 1 2     … 25
                                                     68
                    Problem
• A book record consists of its title, author, pages
  and price. Write a program to perform
  following operations:
  – Read the records of 13 books
  – Create at least one structure pointer to display the
    records of 13 books
  – Store records of all 13 books in the file
    “booklist.dat”
  – Read only the information of 9 books from
    “booklist.dat” skipping 2 books from first and 2
    books from last and display in terminal
                                                      69
#define SIZE 13         for(i=0;i<SIZE;i++)
void main()                {
{                          printf("\nEnter record of
struct book                book%d",i+1);
   {                       printf("\nEnter title:\t");
   char title[40];         scanf("%s",b[i].title);
   char author[20];        fflush(stdin);
   int pages;              printf("\nEnter author:\t");
   float price;            scanf("%s",b[i].author);
   };                      printf("\nEnter no. of
struct book b[SIZE];       pages:\t");
int i;                     scanf("%d",&b[i].pages);
float temp;                printf("\nEnter price:\t");
struct book *bp;           scanf("%f",&temp);
FILE *fp;                  b[i].price=temp;
struct book bb[SIZE];        }
clrscr();
                                                          70
bp=b; //bp=&b[0];
for(i=0;i<SIZE;i++)                 rewind(fp);
    {                               fseek(fp,sizeof(b)*2,0);
    printf("\nRecord of             i=2;
    Book%d",i+1);                   printf("\nReading from file:");
    printf("\nTitle:%s\tAuthor:%s",(while(fread(&bb,sizeof(bb),1,fp)==1)
    bp+i)->title,(bp+i)->author);       {
    printf("\nNo. of                     while(i<SIZE-2)
    pages:%d\tPrice:%.2f\n",(bp+i)-
    >pages,(bp+i)->price);                {
    }                                   printf("\nTitle:%s\tAuthor:%s",
                                        bb[i].title, bb[i].author);
fp=fopen("booklist.dat","w+b");           printf("\nNo. of
                                        pages:%d\tPrice:%f\n",
if(fp==NULL)                            bb[i].pages, bb[i].price);
    {                                     i++;
    puts("Cannot create file");           }
    exit();                             }
    }                               fclose(fp);
for(i=0;i<SIZE;i++)                 getch();
fwrite(&b,sizeof(b),1,fp);          }
                                                                      71
                  PROBLEM
• A car record consists of its model,
  manufacture_year and price. Write a program to
  perform following operations:
   – Read the records of 13 cars.
   – Create at least one structure pointer to display
     the records of 13 cars.
   – Store records of all 13 cars in the file “c.mpg”.
   – Read only the information of 5 cars from
     “c.mpg”, skipping 8 cars from first and display
     in standard output device.
                                                    72
                 PROBLEM
• Create a structure named employee having
  empname, age and salary as its members. Read
  these information for a number of employees (till
  user wants) and write these information to a file
  named employee.txt in C-drive. Finally, the
  program should be able to search the information
  of a particular employee by its empname from the
  file.
                                                  73
void main()                                          }while(ch=='y');
{                                               rewind(fp);
struct employee                                 printf(“\n\tEnter employee to be searched:\t");
     {                                          fflush(stdin);
     char empname[20];                          gets(name);
     int age;                                   while(fread(&e,sizeof(e),1,fp)==1)
     float salary;                                 {
     };                                              if(strcmp(name, e.empname)==0)
struct employee e;                                   {
FILE *fp;                                            search=1;
char name[20];                                       printf("\nName:%s", e.empname);
char ch='y';                                         printf("\nAge:%d", e.age);
int search=0;                                        printf("\nSalary:%.2f", e.salary);
fp=fopen("C:\\employee.txt","w+b");                  }
clrscr();                                          }
     do                                         if(search==0)
     {                                               printf("\nThere is no employee with name
     printf("\nEnter name, age and salary of         %s", name);
     employee:");                               fclose(fp);
     scanf("%s %d %f", e.empname, &e.age,       getch();
     &e.salary);                                }
     fwrite(&e,sizeof(e),1,fp);
     fflush(stdin);
     printf("\nDo you want to information for
     another employee(y for yes):");
     scanf("%c", &ch);
                                                                                                  74
               PROBLEM
• Write a program to open a file employee.txt
  created in above program and edit/modify
  the details of a particular employee.
                                            75
void main()                                              if(strcmp(name, e.empname)==0)
{                                                        {
struct employee                                          search=1;
      {                                                  printf("\n Old record is:");
      char empname[20];                                  printf("\n Name:%s",e.empname);
      int age;                                           printf("\n Age:%d",e.age);
      float salary;                                      printf("\n Salary:%.2f",e.salary);
      };                                                 printf("\n Enter new record(name,age and
struct employee e;                                       salary):");
FILE *fp;                                                scanf("%s %d %f", e.empname, &e.age,
char name[20];                                           &e.salary);
int search=0;                                            fseek(fp,sizeof(e)*record_count,0);
int record_count=0;                                      if(fwrite(&e,sizeof(e),1,fp)==1)
fp=fopen("C:\\employee.txt","rb+");                               printf("\nRecord modified!!!");
clrscr();                                                }
if(fp==NULL)                                             record_count++;
      {                                                 }
      printf("Cannot open file");                    if(search==0)
      exit();                                              printf("\n There is no employee with name %s",
                                                           name);
      }
                                                     fclose(fp);
printf("\tEnter employee name to be modified:\t");
                                                     getch();
gets(name);
                                                     }
while(fread(&e,sizeof(e),1,fp)==1)
 {
76