File Handling Ppt

77
FILE *Handling Concepts in C; TRUPTI TADKAL AND CHITTARANJAN BARAL

description

The purpose of this tutorial is to code a simple malloc function in order to understand theunderlying concepts. We will not code an efficient malloc, just a basic one, but the conceptbehind can be useful to understand how memory is managed in every day processes and how-todeal with blocks allocation, reallocation and freeing.From a pedagogical standpoint, this is a good C practice. It is also a good document tounderstand where your pointers come from and how things are organized in the heap.

Transcript of File Handling Ppt

Page 1: File Handling Ppt

FILE *Handling Concepts in C;

TRUPTI TADKALAND

CHITTARANJAN BARAL

Page 2: File Handling Ppt

©2013 Graphene Semiconductor Confidential

BackgroundConsole 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

Page 3: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 4: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Classification of disk/file I/O functions

Page 5: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Some high-level I/O functions

Page 6: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 7: File Handling Ppt

©2013 Graphene Semiconductor Confidential

File Opening Modes

There are mainly six modes:1.“r” (i.e. read mode)2.“w” (i.e. write mode)3.“a” (i.e. append mode)4.“r+” (i.e. read and write mode)5.“w+” (i.e. write and read mode)6.“a+” (i.e. append and read

mode)

Page 8: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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);

Page 9: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 10: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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);

Page 11: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/* Program to create a file named test.txt and write some text */

#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();}

Page 12: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/* Program to open the file named test.txt, read its content and display it to screen */

#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);

printf("\n Text from file is:%s", s);

fclose(fp);getch();}

Page 13: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/* Program to open the file named test.txt & add to it the text “in CAB” */

#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();}

Page 14: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Naming a filevoid 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.

Page 15: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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);

Page 16: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/* Program to create a file and write some text to it one character at a time using fputc() function until user hits the

enter key*/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();}

elseprintf("\n File is created.");

printf("\n Enter your text until Enter key:\n");while((c=getchar())!='\n')

fputc(c,fp);fclose(fp);getch();}

Page 17: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/* Program to open a file, read its content one character at a time using fgetc() function and display it to

screen*/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();}

printf("\n The content of file is:\n");while((c=fgetc(fp))!=EOF)

putchar(c);fclose(fp);getch();}

//EOF=>end-of-file

Page 18: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 19: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/* Program to append some text to a file by reading filename from user*/

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();}

Page 20: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/* Program to open a file and copy all its content to another file*/

void main(){FILE *sfp,*dfp;char sfilename[20],dfilename[20];char c;clrscr();printf("Enter source filename:\t");gets(sfilename);printf("\n Enter destination filename:\t");gets(dfilename);sfp=fopen(sfilename,"r");if(sfp==NULL)

{printf("\nSource file can't be opened.");exit();}

dfp=fopen(dfilename, "w");if(dfp==NULL)

{printf("\n Destination file cannot be created or opened.");exit();}

while((c=fgetc(sfp))!=EOF)fputc(c, dfp);

printf("\n Copied........");fclose(dfp);fclose(sfp);getch();}

Page 21: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Question

Given a text file, create another text

file deleting all the vowels (a, e, i,

o, u).

Page 22: File Handling Ppt

©2013 Graphene Semiconductor Confidential

void main(){FILE *fp,*fpp;char c;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((c=fgetc(fp))!=EOF) { if((c!='a')&&(c!='e')&&(c!='i')&&(c!='o')&&(c!='u'))

fputc(c, fpp);

}

fclose(fp);fclose(fpp);getch();}

Page 23: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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);

Page 24: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/* Program to create a file named student.txt and write name, roll, address and marks of a student to

this file*/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();}

Page 25: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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();}

Page 26: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 27: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 28: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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();}

Page 29: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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);

printf("\n Enter address:\t");gets(vehicle[i].address);

printf("\n Enter telephone no:\t");scanf("%ld", &vehicle[i].phone_no);

printf("\n Enter vehicle no:\t");scanf("%d", &vehicle[i].vehicle_no);

printf("\n Enter license no:\t");scanf("%d", &vehicle[i].license_no);

fprintf(fp,"%s\t%s\t%ld\t%d\t%d\n", vehicle[i].name, vehicle[i].address, vehicle[i].phone_no, vehicle[i].vehicle_no, vehicle[i].license_no);fflush(stdin);}

Page 30: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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].vehicle_no,v[i].license_no);

}fclose(fp);getch();}

Page 31: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Problem• Given a text file, create

another text file deleting the following words “three”, “bad”, and “time”.

Page 32: File Handling Ppt

©2013 Graphene Semiconductor Confidential

#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();}

Page 33: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Problem• Some text file is given, create another

text file replacing the following words “Ram” to “Hari”, “Sita” to “Gita”, and “Govinda” to “Shiva”.

Page 34: File Handling Ppt

©2013 Graphene Semiconductor Confidential

#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, "Ram")==0)

fprintf(fpp, "Hari ",c);

else if(strcmp(c, "Sita")==0)fprintf(fpp,"Gita",c);

else if(strcmp(c, "Govinda")==0)fprintf(fpp, "Shiva",c);

elsefprintf(fpp,"%s ",c);

}fclose(fp);fclose(fpp);getch();}

Page 35: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 36: File Handling Ppt

©2013 Graphene Semiconductor Confidential

#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();}

Page 37: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 38: File Handling Ppt

©2013 Graphene Semiconductor Confidential

#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");

Page 39: File Handling Ppt

©2013 Graphene Semiconductor Confidential

for(i=0;i<n;i++){fscanf(fpdata,"%d", &num);

if(num%2==0)fprintf(fpeven,"%d\t", num);elsefprintf(fpodd,"%d\t", num);

}

fclose(fpdata);fclose(fpodd);fclose(fpeven);getch();}

Page 40: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 41: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 42: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 43: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.txtopen_file:

scanf("%s", filename);

Page 44: File Handling Ppt

©2013 Graphene Semiconductor Confidential

if((fp1=fopen(filename,"r"))==NULL){printf("\nAn error occured while opening the file.");printf("\nType filename again:\t");goto open_file;}

elsefor(i=1;i<=20;i++){fscanf(fp1,"%d", &num);if(feof(fp1))

{printf("\nRan out of data.");break;}

elseprintf("%d\n", num);

}fclose(fp1);getch();}

Page 45: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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();}

Page 46: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Binary Data FilesThe 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”iv.“r+” is replaced by “r+b”v. “w+” is replaced by “w+b”vi.“a+” is replaced by “a+b”

Note: For text mode we can write “rt” in place of “r”, “wt” in place of “w”and so on. However, it is unnessary because default mode is text mode

Page 47: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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();}

Page 48: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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?

I. How newlines are stored in binary mode???

Page 49: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/*Count no. of characters, spaces, and newlines in a file*/

void main(){FILE *fp;char text[100];char c;int noc=0,nos=0,nol=0;fp=fopen("C:\\poem.txt", "r");if(fp==NULL)

{printf("\nCannot create or open file.");exit();}

while(1){

c=fgetc(fp);if(c==EOF)

break;noc++;if(c==' ')

nos++;if(c=='\n')

nol++;}

fclose(fp);printf("\n No. of characters:%d",

noc);printf("\n No. of spaces:%d", nos);printf("\n No. of lines:%d", nol);getch();}

Page 50: File Handling Ppt

©2013 Graphene Semiconductor Confidential

The poem.txt file contains:Johnny JohnnyYes PapaEating SugarNo PapaTelling LiesNo PapaOpen Your Mouthhahaha

So output is:No. of characters=87No. of spaces=8No. of lines=7which is correct.

Now, go to DOS shell and use the DIR command in C-drive to view the no. of characters (bytes) that the file poem.txt occupies which is 94.

Page 51: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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).

Page 52: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/*Count no. of characters, spaces, and newlines in a file*/

void main(){FILE *fp;char text[100];char c;int noc=0,nos=0,nol=0;fp=fopen("C:\\poem.txt", "rb");if(fp==NULL)

{printf("\nCannot create or open file.");exit();}

while(1){

c=fgetc(fp);if(c==EOF)

break;noc++;if(c==' ')

nos++;if(c=='\n')

nol++;}

fclose(fp);printf("\n No. of characters:%d",

noc);printf("\n No. of spaces:%d", nos);printf("\n No. of lines:%d", nol);getch();}

Page 53: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 54: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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().

Page 55: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 56: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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>void main(){FILE *fp;char another='Y';struct emp

{char name[40];int age;float salary;};

struct emp e;fp=fopen("c:\\emp.dat","wb");if(fp==NULL)

{puts("Cannot create or open

file");exit();}

while(another=='Y'){

printf("\nEnter name, age and basic salary");scanf("%s %d %f",e.name,&e.age,&e.salary);fprintf(fp,"%s\t%d\t%f",e.name,e.age,e.salary);printf("\nAdd another record(Y/N):\t");fflush(stdin);another=getche();}fclose(fp);getch();} Here, if the no. of fields

in the structure increase (say by adding address, house rent allowance etc.), writing structures using fprintf(), or reading them using fscanf(), becomes quite clumsy.

Page 57: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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);

• fread(): is used for record input.Syntax:fread (&p, size_of_array_or_structure,

no._of_array_or_structure, fp);

Page 58: File Handling Ppt

©2013 Graphene Semiconductor Confidential

#include <stdio.h>void main(){FILE *fp;char another='Y';struct emp

{char name[40];int age;float salary;};

struct emp e;clrscr();

fp=fopen("c:\\emp.dat","wb");

if(fp==NULL){puts("Cannot create or open file");exit();}

while(another=='Y'||another=='y'){

printf("\n Enter name, age and basic salary:");scanf("%s %d %f", e.name, &e.age, &e.salary);fwrite(&e,sizeof(e),1,fp);printf("\n Add another record(Y/N):\t");fflush(stdin);another=getche();}

fclose(fp);fp=fopen("c:\\emp.dat","rb");if(fp==NULL)

{puts("Cannot create or open file");exit();}

while(fread(&e,sizeof(e),1,fp)==1){printf("\n%s\t%d\t%f", e.name, e.age, e.salary);}

fclose(fp);getch();}

Page 59: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/* Same program to write/read array of structure to a binary mode file*/

#include <stdio.h>void main(){FILE *fp;struct emp

{char name[40];int age;float salary;};

struct emp e[2],ee[2];int i;float temp;clrscr();

fp=fopen("c:\\employee.dat","wb");

if(fp==NULL){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);e[i].salary=temp;fflush(stdin);}

fwrite(&e,sizeof(e),2,fp);fclose(fp);fp=fopen("c:\\employee.dat","rb");if(fp==NULL)

{puts("Cannot open file");exit();}

fread(&ee,sizeof(ee),2,fp)for(i=0;i<2;i++)printf("\n%s\t%d\t%.2f", ee[i].name, ee[i].age, ee[i].salary);

fclose(fp);getch();}

Page 60: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 61: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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

Page 62: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Functions used in random access1. 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).

Page 63: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Functions used in random access2. 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.

Page 64: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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:

Page 65: File Handling Ppt

©2013 Graphene Semiconductor Confidential

fseek()…• The offset may be positive, meaning

move forwards, or negative, meaning move backwards.

• Examples:

Page 66: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 67: File Handling Ppt

©2013 Graphene Semiconductor Confidential

/*A program that uses the functions ftell() and fseek()*/

#include <stdio.h>void main(){FILE *fp;char c;long n;clrscr();fp=fopen("RANDOM","w");if(fp==NULL)

{printf("\nCannot create file.");exit();}

while((c=getchar())!=EOF) fputc(c,fp);printf("\nNo. of characters entered=

%ld",ftell(fp));

fclose(fp);fp=fopen("RANDOM","r");if(fp==NULL)

{

printf("\nCannot create file.");exit();}

n=0L;while(feof(fp)==0)

{fseek(fp,n,0); //Position to (n+1)th characterprintf("Position of %c is %ld\n",fgetc(fp),ftell(fp));n=n+5L;}

putchar('\n');

fseek(fp,-1L,2); /*Position to the last character*/do{putchar(fgetc(fp));}while(!fseek(fp,-2L,1));

fclose(fp);getch();}

Page 68: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Explanation• A file called RANDOM is created with

the following contents:Stored Character: A B C …

ZFile Pointer Position: 0 1 2 …

25

• Then the file is read twice.• At first, we read the contents of every

fifth position and print its value with its position on the screen.

• At second, we read the contents of the file from the end and print the same on screen.

Page 69: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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

Page 70: File Handling Ppt

©2013 Graphene Semiconductor Confidential

#define SIZE 13void main(){struct book

{char title[40];char author[20];int pages;float price;};

struct book b[SIZE];int i;float temp;struct book *bp;FILE *fp;struct book bb[SIZE];

clrscr();for(i=0;i<SIZE;i++)

{printf("\nEnter record of book%d",i+1);printf("\nEnter title:\t");scanf("%s",b[i].title);fflush(stdin);printf("\nEnter author:\t");scanf("%s",b[i].author);printf("\nEnter no. of pages:\t");scanf("%d",&b[i].pages);printf("\nEnter price:\t");scanf("%f",&temp);b[i].price=temp;

}

Page 71: File Handling Ppt

©2013 Graphene Semiconductor Confidential

bp=b; //bp=&b[0];for(i=0;i<SIZE;i++)

{printf("\nRecord of Book%d",i+1);printf("\nTitle:%s\tAuthor:%s",(bp+i)->title,(bp+i)->author);printf("\nNo. of pages:%d\tPrice:%.2f\n",(bp+i)->pages,(bp+i)->price);}

fp=fopen("booklist.dat","w+b");if(fp==NULL)

{puts("Cannot create file");exit();}

for(i=0;i<SIZE;i++)fwrite(&b,sizeof(b),1,fp);

rewind(fp);fseek(fp,sizeof(b)*2,0);i=2;printf("\nReading from file:");while(fread(&bb,sizeof(bb),1,fp)==1)

{ while(i<SIZE-2) {printf("\nTitle:%s\tAuthor:%s", bb[i].title, bb[i].author); printf("\nNo. of pages:%d\tPrice:%f\n", bb[i].pages, bb[i].price); i++; }}

fclose(fp);getch();}

Page 72: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 73: File Handling Ppt

©2013 Graphene Semiconductor Confidential

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.

Page 74: File Handling Ppt

©2013 Graphene Semiconductor Confidential

void main(){struct employee

{char empname[20];int age;float salary;};

struct employee e;FILE *fp;char name[20];char ch='y';int search=0;fp=fopen("C:\\employee.txt","w+b");clrscr();

do{printf("\nEnter name, age and salary of employee:");scanf("%s %d %f", e.empname, &e.age, &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);}while(ch=='y');

rewind(fp);printf(“\n\tEnter employee to be searched:\t");fflush(stdin);gets(name);while(fread(&e,sizeof(e),1,fp)==1) {

if(strcmp(name, e.empname)==0){search=1;printf("\nName:%s", e.empname);printf("\nAge:%d", e.age);printf("\nSalary:%.2f", e.salary);}

}if(search==0)

printf("\nThere is no employee with name %s", name);

fclose(fp);getch();}

Page 75: File Handling Ppt

©2013 Graphene Semiconductor Confidential

Problem• Write a program to open a file

employee.txt created in above program and edit/modify the details of a particular employee.

Page 76: File Handling Ppt

©2013 Graphene Semiconductor Confidential

void main(){struct employee

{char empname[20];int age;float salary;};

struct employee e;FILE *fp;char name[20];int search=0;int record_count=0;fp=fopen("C:\\employee.txt","rb+");clrscr();if(fp==NULL)

{printf("Cannot open file");exit();}

printf("\tEnter employee name to be modified:\t");gets(name);

while(fread(&e,sizeof(e),1,fp)==1) {

if(strcmp(name, e.empname)==0)

{search=1;printf("\n Old record is:");printf("\n Name:%s",e.empname);printf("\n Age:%d",e.age);printf("\n Salary:%.2f",e.salary);printf("\n Enter new record(name,age and salary):");scanf("%s %d %f", e.empname, &e.age, &e.salary);fseek(fp,sizeof(e)*record_count,0);if(fwrite(&e,sizeof(e),1,fp)==1)

printf("\nRecord modified!!!");}record_count++;

}if(search==0)

printf("\n There is no employee with name %s", name);

fclose(fp);getch();}

Page 77: File Handling Ppt

Thank You

www.graphsemi.com