330 likes | 493 Views
Chapter 12: Data Files and File Processing. Objectives: You’ll learn about; Introduction Files and streams Creating a sequential access file Reading data from a sequential access file Using fgetc() and fputc() Using fread() and fwrite(). Introduction.
E N D
Chapter 12: Data Files and File Processing Objectives: You’ll learn about; • Introduction • Files and streams • Creating a sequential access file • Reading data from a sequential access file • Using fgetc() and fputc() • Using fread() and fwrite() Chapter 12 : File Processing
Introduction • Storage of data in variables and arrays is temporary-all such data are lost when a program terminates. • Files are used for permanent retention of large amounts of data. • Computers store files on secondary storage devices esp. disk storage devices. • A file is a group of related records. • A record is a group of related fields. Chapter 12 : File Processing
0 1 2 3 4 5 6 7 8 . . . . . n-1 Files and Streams • C views a file as a sequential stream of bytes. • A file ends either with an EOF (end-of-file) marker or at a specified byte number specified by the system. • When a file is opened, a stream is associated with a file. • Streams provide communication channels between files and the programs. Chapter 12 : File Processing
Files and Streams cont… • In addition to providing access to a file, a stream can also be used to access devices. • For example, when a program (any program) is executed, 3 streams are automatically opened: • standard input (stdin) • enable the program to read data from keyboard • standard output (stdout) • enable the program to print data on the screen • standard error (stderr) • enable program to print errors on the screen • They are all manipulated using file pointers. Chapter 12 : File Processing
Creating a Sequential Access File #include <stdio.h> void main (void) { int account; char name[30]; float balance; FILE *fptr; if ((fptr = fopen("D:/clients.txt", "w")) == NULL) printf("Error: the file cannot be opened\n"); else { printf ("Enter the account #, name and balance or EOF to end input:\n"); scanf ("%d %s %f", &account, name, &balance); while (!feof(stdin)) { fprintf(fptr, "%d %s %.2f\n", account, name, balance); scanf ("%d%s%f", &account, name, &balance); } } fclose (fptr); } Chapter 12 : File Processing
Creating a Sequential Access File cont… • Output from program that creates sequential access file Enter the account #, name and balance or EOF to end input: 111 sara 24.98 222 hannah 345.67 333 ruby 0.00 444 Arris -42.16 555 Nufail 224.62 666 Yasmin 987.90 ^Z Press any key to continue Chapter 12 : File Processing
Creating a Sequential Access File cont… • Content of “D:/client.txt”: Chapter 12 : File Processing
Creating a Sequential Access File cont… • FILE *fptr; • States that f is a pointer to a file structure • If there is more than one file, each file needs to have its own FILE pointer. • if ((fptr = fopen("D:/clients.txt", "w")) == NULL) • The fopen() function takes 2 arguments: the file name and the file mode. • This statement will try to open a file named “clients.txt”. • If the file is to be placed in a different directory than the program directory, the full path need to be specified. For example: “D:/clients.txt” • The function returns a pointer to the successfully opened file. But if the file cannot be opened, a NULL is returned. • The option “w” is the mode of the file to be opened. Chapter 12 : File Processing
Creating a Sequential Access File cont… r - open for reading w - open for writing (file need not exist),if the file already exists, discard current contents a - open for appending (file need not exist), writing at the end of the file. If the file already exists, discard current contents r+ - open for reading and writing, start at beginning w+ - open for reading and writing (overwrite file) a+ - open for reading and writing (append if file exists), writing is done at the end of the file Chapter 12 : File Processing
Creating a Sequential Access File cont… • while (!feof(stdin)) • Determines whether the input from the keyboard is an EOF character or not. If it is an EOF character, the while loop will terminate. • An EOF character is not the word “EOF” Chapter 12 : File Processing
Creating a Sequential Access File cont… • fprintf(fptr, "%d %s %.2f\n", account, name, balance); • Writes data to the file clients.dat • Equivalent to printf() except that it receives as an argument a file pointer for the file to which the data will be written. • feof(fptr); • Closes the file “clients.txt”. • Will actually write the data to the file. • If fclose() is not called explicitly, the operating system will close the file when the program terminates. Chapter 12 : File Processing
Creating a Sequential Access File cont… • If an error occurs while opening a file (in which case fopen() returns a NULL), it could be due to any of these errors: • Opening a non-existing file for reading • Opening a file for reading or writing without having granted the appropriate access to the file by the operating system. • Opening a file for writing when no disk space is available. • Always remember that the mode “w” will overwrite the current data in the file. When we want to update a file, always use the update mode r+” (but w/r from top) Chapter 12 : File Processing
Reading Data from a Sequential Access File #include <stdio.h> void main (void) { int account; char name[30]; float balance; FILE *fptr; if ((fptr = fopen("D:/clients.txt", "r")) == NULL) printf("Error: the file cannot be opened\n"); else { printf ("%-10s%-13s%s\n", "Account", "Name", "Balance"); fscanf (fptr, "%d %s %f", &account, name, &balance); while (!feof(fptr)) { printf ("%-10d%-13s%.2f\n", account, name, balance); fscanf (fptr, "%d %s %f", &account, name, &balance); } } fclose (fptr); } Chapter 12 : File Processing
Reading Data from a Sequential Access File cont… • Output from program that reads data from sequential access file Account Name Balance 111 sara 24.98 222 hannah 345.67 333 ruby 0.00 444 Arris -42.16 555 Nufail 224.62 666 Yasmin 987.90 Press any key to continue Chapter 12 : File Processing
Reading Data from a Sequential Access File cont… • if ((fptr = fopen("D:/clients.txt", "r")) == NULL) • Attempts to open the file clients.txt for reading and determines whether the file is opened successfully. Notice that the mode used is “r”. • fscanf (fptr, "%d %s %f", &account, name, &balance); • Reads data from the file clients.txt • Equivalent to function scanf() except that it receives as an argument a file pointer for the file from which the data is read. Chapter 12 : File Processing
Complete credit inquiry program #include<stdio.h> void main() { int request, account; float balance; char name[30]; FILE *fptr; if ((fptr = fopen("D:/clients.txt", "r")) == NULL) printf("Error: the file cannot be opened\n"); else { printf("Enter request\n" "1 - List accounts with zero balances\n" "2 - List accounts with credit balances\n" "3 - List accounts with debit balances\n" "4 - End of run\n? "); scanf("%d", &request); Chapter 12 : File Processing
Complete credit inquiry program cont… while(request!=4) { fscanf (fptr, "%d %s %f", &account, name, &balance); switch(request){ case 1: printf("\nAccounts with zero balances:\n"); while (!feof(fptr)) { if( balance == 0 ) { printf ("%-10d%-13s%.2f\n", account, name, balance); } fscanf (fptr, "%d %s %f", &account, name, &balance); } break; Chapter 12 : File Processing
Complete credit inquiry program cont… case 2: printf("\nAccounts with credit balances:\n"); while (!feof(fptr)) { if( balance < 0 ) { printf ("%-10d%-13s%.2f\n", account, name, balance); } fscanf (fptr, "%d %s %f", &account, name, &balance); } break; Chapter 12 : File Processing
Complete credit inquiry program cont… case 3: printf("\nAccounts with debit balances:\n"); while (!feof(fptr)) { if( balance > 0 ) { printf ("%-10d%-13s%.2f\n", account, name, balance); } fscanf (fptr, "%d %s %f", &account, name, &balance); } break; } /* End while before switch */ Chapter 12 : File Processing
Complete credit inquiry program cont… rewind(fptr); /* return fptr to beginning of file */ printf("\n? "); scanf("%d", &request); } /* End while before switch */ printf("End of run.\n"); fclose(fptr); } /* End else */ } /* End main */ Chapter 12 : File Processing
Output Enter request 1 - List accounts with zero balances 2 - List accounts with credit balances 3 - List accounts with debit balances 4 - End of run ? 1 Accounts with zero balances: 333 ruby 0.00 Chapter 12 : File Processing
Complete credit inquiry program cont… ? 2 Accounts with credit balances: 444 Arris -42.16 ? 3 Accounts with debit balances: 111 sara 24.98 222 hannah 345.67 555 Nufail 224.62 666 Yasmin 987.90 Chapter 12 : File Processing
Complete credit inquiry program cont… ? 4 End of run. Press any key to continue NOTE : You must create a sequential access file first, then run this complete program to get such output. Chapter 12 : File Processing
Using fgetc() and fputc() • Syntax: • int fgetc(FILE *f) • fputc(int c, FILE *f) • fgetc() reads a character from the file referred to by the file pointer f. • fputc() puts the character c into the file referred to by the file pointer f. • If the file has reached the end, fgetc() will return the EOF character. Chapter 12 : File Processing
Summary Chapter 12 : File Processing
FILES WHY “FILES” ? Data can be permanently stored in magnetic media. Facilitates batch processing. What to learn from FILES topic? File handling functions and commands. Text and Binary files processing. Chapter 12 : File Processing
It is necessary to open a file before it can be used for reading or writing. • When a file is no longer in used or access mode is changed (from read to write or append), it should be closed. Opening and Closing Files A file can have one of the following access mode: “r” read only “w” write only “a” append from the end “r+” “w+” read/write from beginning “a+” read and append Chapter 12 : File Processing
FILE VARIABLE DECLARATION TO OPEN A FILE FOR READING: FILE *fopen(const char *path, const char *type); Example in C: FILE *textFile; textFile = fopen(“c:\Cfolder\data.txt”, “r”); TO CLOSE FILES: fclose(filename); Chapter 12 : File Processing
TEXT FILES • A collection of ASCII characters, written in lines and each line contains a specific end-of-line marker. • In the end of the text file there is an end-of-file marker. IMPORTANT!! A text file can be created and viewed using an editor while a binary file CANNOT. A text file can also be created from within a program by writing data (line by line or character by character) to a file that has been declared as text file. Chapter 12 : File Processing
Associated commands are: fputc() -writes a char at a time to a file fputs() -writes a string to a file fprintf() - writes a variable number of items to an output stream fgetc() - reads a char from stream fgets() - reads from stream into array fscanf() - reads a variable number of items from stream feof - tests if file has reaches its end. Chapter 12 : File Processing
A sequence arbitrary bytes of structured data. • Not in human readable form. IMPORTANT!! A BINARY FILE can ONLY be created from within a program. A binary file CANNOT be viewed by an editor. To view the contents of a binary file is to write a program (or subprogram) to read each structure and format them to screen. BINARY FILES Chapter 12 : File Processing
Associated commands are: fread()- reads a specified number of items from the stream fwrite() - writes the specified max number of item to the stream. feof - tests if file has reaches its end. Given these declarations: FILE *data //text file variable FILE *topTen; //random access file infor chart[11]; int position; infor line[1]; Chapter 12 : File Processing
data = fopen(“a:\song.txt”, “r”); topTen = fopen(“c:\Cfolder\pop.bin”, “wb”); fgets(chart[position].record,60,data); fscanf(data, “%d”, &position); fread(line, sizeof(infor), 1, topTen); fwrite(chart, sizeof(infor), 11, topTen); fseek(topTen, (long int) position *sizeof(infor), SEEK_SET); fclose(topTen); Chapter 12 : File Processing