120 likes | 311 Views
Chapter 11: Data Files and File Processing. Files and streams Creating a sequential access file Reading data from a sequential access file Using fgetc() and fputc() Using fread() and fwrite(). Files and Streams. C views a file as a sequential stream of bytes.
E N D
Chapter 11: Data Files and File Processing • Files and streams • Creating a sequential access file • Reading data from a sequential access file • Using fgetc() and fputc() • Using fread() and fwrite()
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.
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.
Creating a Sequential Access File #include <stdio.h> void main (void) { int account; char name[30]; float balance; FILE *f; if ((f = fopen(“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(f, “%d %s %.2f”, account, name, balance); scanf (“%d%s%f”, &account, name, &balance); } } fclose (f); }
FILE *f; • 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 ((f = fopen(“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: “A:\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.
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” !!!
fprintf (f, “%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. • fclose(f); • 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.
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+”.
Reading Data from a Sequential Access File void main (void) { int account; char name[30]; float balance; FILE *fptr; if ((fptr = fopen(“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 (“%-10s%-13s%s\n”, “Account”, “Name”, “Balance”); fscanf (fptr, “%d%s%f”, &account, name, &balance); } } fclose (fptr); }
if ((fptr = fopen(“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.
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.
Using fread() and fwrite() • Syntax: • size_t fread (void *d, size_t s, size_t n, FILE *f) • size_t fwrite (const void *d, size_t s, size_t n, FILE *f) • fread() reads n items of size s into the memory pointed to by d. The function returns the total size of data that has been read. • fwrite writes n items of size s from the memory pointed to by d. The function returns the total size of data that has been successfully written.