1 / 27

Files in C

Files in C. File Types. The UNIX filesystem contains several different types of files: Ordinary Files Used to store your information, such as some text you have written or an image you have drawn. This is the type of file that you usually work with.

rafael-kim
Download Presentation

Files in C

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Files in C

  2. File Types • The UNIX filesystem contains several different types of files: • Ordinary Files • Used to store your information, such as some text you have written or an image you have drawn. This is the type of file that you usually work with. • Always located within/under a directory file • Do not contain other files • Directories • Branching points in the hierarchical tree • Used to organize groups of files • May contain ordinary files, special files or other directories • Never contain "real" information which you would work with (such as text). Basically, just used for organizing files. • All files are descendants of the root directory, ( named / ) located at the top of the tree.

  3. More Files • Special Files • Used to represent a real physical device such as a printer, tape drive or terminal, used for Input/Ouput (I/O) operations • Unix considers any device attached to the system to be a file - including your terminal: • By default, a command treats your terminal as the standard input file (stdin) from which to read its input • Your terminal is also treated as the standard output file (stdout) to which a command's output is sent • Stdin and stdout will be discussed in more detail later • Two types of I/O: character and block • Usually only found under directories named /dev • Pipes • UNIX allows you to link commands together using a pipe. The pipe acts a temporary file which only exists to hold data from one command until it is read by another • For example, to pipe the output from one command into another command: who | wc -l This command will tell you how many users are currently logged into the system. The standard output from the who command is a list of all the users currently logged into the system. This output is piped into the wc command as its standard input. Used with the -l option this command counts the numbers of lines in the standard input and displays the result on its standard output - your terminal.

  4. Important concepts: • File -- a named set of data stored together on the disk. C views any file as a stream of bytes – it’s up to the programmer to give it a structure. • • to use: (1) open the file; (2) read/write from/to the file; (3) close file.

  5. Hierarchical File Structure • All of the files in the UNIX file system are organized into a multi-leveled hierarchy called a directory tree. • A family tree is an example of a hierarchical structure that represents how the UNIX file system is organized. The UNIX file system might also be envisioned as an inverted tree or the root system of plant. • At the very top of the file system is single directory called "root" which is represented by a / (slash). All other files are "descendents" of root. • The number of levels is largely arbitrary, although most UNIX systems share some organizational similarities. The "standard" UNIX file system is discussed later.

  6. / (root) • | • ------------------------- • | | | • /bin /usr /tmp • | • ------------------------- • | | | • /public /misc /staff

  7. Introduction • • All Input/Output up to now has been done from/to the keyboard/screen. • • There is a serious limitation with this: when the program terminates, the • data is lost. So we can’t write a database program, which stores • information and retrieves this information next time the program is started. • Or a word processor. Or an email system. Or a spreadsheet. Or … • • We can however use external storage devices like the computer’s hard disk for storage. Instead of writing output to the screen, we can write it to a file. This data won’t be lost when the program terminates.

  8. Binary and Text Files • C can handle two types of files: binary files and text (or ASCII) files. The difference between the two file types is in the way they store numeric data. • If numeric data is stored in a binary file, it is stored as binary numbers. • If numeric data is stored in a text file, each digit of the numeric data is converted to its ASCII format and stored like that. • So the number 123 requires three bytes of storage in a text file because it has three digits: ‘1’, ‘2’, and ‘3’. • 123 only requires 2 bytes of storage in a binary file because the binary representations of integer values take up two bytes. • So binary files are more compact for storing data which is primarily • numeric.

  9. Introduction to File Input/Output • Also, numeric data must be converted to its ASCII form before • writing to a text file and converted from its ASCII form when reading • from a text file. • With binary files, no such conversions are necessary. • However, text files are easily displayed on the screen (using e.g. the • Windows notepad editor), so their contents can be easily examined or • checked. They can also be read easily by other programs. Neither of these • is true for binary files.

  10. Declaring Files • You declare a variable to store a file pointer like this: • FILE *fp; • The type FILE is predefined for you by <stdio.h>. It is a data structure which holds the information the standard I/O library needs to keep track of the file for you. For historical reasons, you declare a variable which is a pointer to this FILE type. • The name of the variable can (as for any variable) be anything you choose; it is traditional to use the letters fp in the variable name (since we're talking about a file pointer). If you were reading from two files at once you'd probably use two file pointers: FILE *fp1, *fp2;

  11. File Names • UNIX permits file names to use most characters, but avoid spaces, tabs and characters that have a special meaning to the shell, such as: & ; ( ) | ? \ ' " ` [ ] { } < > $ - ! / • Case Sensitivity: uppercase and lowercase are not the same! These are three different files: NOVEMBER November november • Length: can be up to 256 characters • Extensions: may be used to identify types of files libc.a - archive, • library file program.c - C language source file alpha2.f - Fortran source file • xwd2ps.o - Object/executable code • mygames.Z - Compressed file

  12. Miscellaneous File Names • Hidden Files: have names that begin with a dot (.) For example: .cshrc .login .mailrc .mwmrc • Uniqueness: as children in a family, no two files with the same parent directory can have the same name. Files located in separate directories can have identical names. • Reserved Filenames: • / - the root directory (slash) • . - current directory (period) • .. - parent directory (double period) • ~ - your home directory (tilde)

  13. Pathnames • Specify where a file is located in the hierarchically organized file system • Must know how to use pathnames to navigate the UNIX file system • Absolute Pathname: tells how to reach a file begining from the root; always begins with / (slash). For example: /usr/local/doc/training/sample.f • Relative Pathname: tells how to reach a file from the directory you are currently in ( current or working directory); never begins with / (slash). For example: training/sample.f ../bin ~/projects/report.001 • For example, if your current directory is /usr/home/johnson and you wanted to change to the directory /usr/home/quattro, you could use either of these commands: cd ../quattro - relative pathname cd /usr/home/quattro - absolute pathname

  14. Input from File Example • #include <stdio.h> • void main(void){ • int var1, var2; /* not initialised */ • FILE *fp; • /* fp is a variable of type "FILE *" and is */ • /* called a file pointer. The datatype */ • /* "FILE" is defined in stdio.h, and is a */ • /* structure in which C keeps information */ • /* about a file */ • fp=fopen("datafile.txt", "r"); /* open read-only */ • fscanf(fp, "%d %d", &var1, &var2); • fclose(fp); • printf("first value read in was %d\n", var1); • printf("second value read in was %d\n", var2); • } • Contents of file datafile.txt: 3 • -1 • Produces the screen output: first value read in was 3 • second value read in was -1

  15. Input from file continued • fp=fopen("datafile.txt", "r"); • This statement “associates” the file datafile.txt with the file pointer fp, • and tells the C compiler that the program is opening datafile.txt for • reading only. • 2nd argument to fopen() gives the file’s “open mode” – possibilities include: • r open an existing file for reading only • w open a new file (or overwrite an existing file) for writing only • a open a file for appending (writing at the end of the file) – creates a new file if it • doesn’t currently exist • r+ open an existing file for reading and writing, starting at the beginning of the file • w+ open a new file (or overwrite an existing file) for reading and writing • a+ open a file for reading and appending – creates a new file if it doesn’t currently exist

  16. fscanf(fp, "%d %d", &var1, &var2); • Enables formatted input from the file pointed to by fp, otherwise has the • same functionality as scanf() • fclose(fp); • When program is finished with an open file, it should “break” the • association that was formed when the file was opened. This fclose() • statement closes the file pointed to by fp. • Any files which have not been closed by fclose() are automatically • closed (by the Operating System) when program execution is finished.

  17. Output To File • #include <stdio.h> • void main(void){ • int var1, var2; /* not initialised */ • FILE *fp; • FILE *fptr; • fp=fopen("datafile.txt", "r"); • fscanf(fp, "%d %d", &var1, &var2); • fclose(fp); • fptr=fopen("datafile.txt", "w"); /* open write-only */ • fprintf(fptr, "%d\n%d", var2, var1); /* swap values */ • fclose(fptr); • } • Contents of file datafile.txt before program execution: 3 • -1 • Contents of file datafile.txt after program execution: -1 • 3 • (so in this case, the contents of datafile.txt have been overwritten)

  18. Output To File • fptr=fopen("datafile.txt", "w"); • Now we open datafile.txt again, this time for writing. We use a • different file pointer, fptr, to point to the opened file. • fprintf(fptr, "%d\n%d", var2, var1); • Enables formatted output to the file pointed to by fp, otherwise has the • same functionality as printf() • fclose(fptr); • Again, it is important to close the file when the program is finished with it.

  19. Output To File • #include <stdio.h> • void main(void){ • int var1, var2; /* not initialised */ • FILE *fp; • fp=fopen("datafile.txt", "r"); • fscanf(fp, "%d %d", &var1, &var2); • fp=fopen("datafile.txt", "w"); /* change mode */ • fprintf(fp, "%d\n%d", var2, var1); • fclose(fp); • } • Contents of file datafile.txt before program execution: 3 • -1 • Contents of file datafile.txt after program execution: -1

  20. Output to File example of Appending • #include <stdio.h> • void main(void){ • int var1, var2; /* not initialised */ • FILE *fp; • FILE *fptr; • fp=fopen("datafile.txt", "r"); • fscanf(fp, "%d %d", &var1, &var2); • fclose(fp); • fptr=fopen("datafile.txt", "a"); • fprintf(fptr, "%d\n%d", var2, var1); • fclose(fptr); • } • Contents of file datafile.txt before program execution: 3 • -1 • Contents of file datafile.txt after program execution: 3 • -1 • -1 • 3

  21. Reading Data from a file • First, you have to know the name of the file and where it is stored. • You also need to know how the data is laid out in the file. In particular: • • Order and datatype(s) of the data values. • • How much data is in the file. 3 common methods for this: • – First line tells the number of data “records” that follow. • – Sentinel signal: a value outside the range of actual data values • which indicates that the end of the data has been reached. • – Test to see if the special end-of-file indicator (inserted into every • file by the Operating System) has been reached. This is usually • the best choice. • Of course, if you write data to a file, you may have to decide which way • of storing the data is most suitable for your application.

  22. Reading Data from a file example • Contents of datafile1.txt: 3 • 0.2 80 • 0.7 60 • 0.1 50 • (here, the first value tells us the number of lines of data – to read them, you • should use a counter-controlled loop…) • Contents of datafile2.txt: 0.2 80 • 0.7 60 • 0.1 50 • -99 -99 • (here, the sentinel values tell us that the end of the data has been reached – you • should use a loop and test for the sentinel values each time around…) • Contents of datafile3.txt: 0.2 80 • 0.7 60 • 0.1 50 • (here, the file is just data – you should check whether each read got the end-offile • indicator. An example program to do this is given next)

  23. Reading data from a file example Program • #include <stdio.h> • void main(void){ • float prob, avg=0.0; • int quantity, num_values=0; • FILE *fptr; • fptr=fopen("datafile3.txt", "r"); • while(fscanf(fptr, " %f %d", &prob, &quantity)==2){ • /* if return value from this fscanf() is not 2, */ • /* the end-of-file indicator has been reached */ • avg = avg + (prob*quantity); • } • fclose(fptr); • printf("average value is %.2f\n", avg); • } • Produces the correct screen output: average value is 63.00 • Note: return value from fscanf() – and scanf() – is the number of • successful assignments. So in this case, this return value should be 2 every • time a valid data “record” has been read. Otherwise – error or end-of-file.

  24. I/O with Files • The companion function to printf is fprintf, and the file pointer argument comes first. To print a string to the output.dat file we opened in the previous section, we might call • fprintf(ofp, "Hello, world!\n"); • The companion function to putchar is putc, and the file pointer argument comes last. To write a character to output.dat, we could call • putc(c, ofp);

  25. Input • The companion function to getchar is getc, and the file pointer is its only argument. To read a character from the input.dat file we opened in the previous section, we might call • int c; c = getc(ifp); • Our own getline function calls getchar and so always reads the standard input. We could write a companion fgetline function which reads from an arbitrary file pointer:

  26. Example Program • #include <stdio.h> /* Read one line from fp, */ • /* copying it to line array (but no more than max chars). */ • /* Does not place terminating \n in line array. */ • /* Returns line length, or 0 for empty line, or EOF for end-of-file. */ • int fgetline(FILE *fp, char line[], int max) • { int nch = 0; int c; max = max - 1; • /* leave room for '\0' */ • while((c = getc(fp)) != EOF) • { if(c == '\n') break; if(nch < max) • { line[nch] = c; nch = nch + 1; } • } • if(c == EOF && nch == 0) return EOF; • line[nch] = '\0'; • return nch; }

  27. Or Else • Now we could read one line from ifp by calling • char line[MAXLINE]; ... fgetline(ifp, line, MAXLINE);

More Related