420 likes | 555 Views
Working with Files in C. ATS 315. In Windows and on Macs, we tend to think of files as “containing something”. But that’s a bad metaphor. Misunderstandings about “files”. All lined up, working with them in order. Single “file”. Files are single files of ones and zeros (a.k.a. “bits”). 1.
E N D
Working with Files in C ATS 315
In Windows and on Macs, we tend to think of files as “containing something”. But that’s a bad metaphor. Misunderstandings about “files”
All lined up, working with them in order. Single “file”
Files are single files of ones and zeros (a.k.a. “bits”). 1 0 0 0 1 1 0 1 Single “file”
Usually work with eight bits at a time (a.k.a. “byte”) There are 256 possible bytes. 1 0 0 0 1 1 0 1 Single “file”
ASCII • A code that converts each of the 256 possible bytes into a symbol. 01011101 “A” 01101110 “B” 11101001 “newline” 11100101 “+”
A typical file 0100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010…
A typical file 0100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010…
A typical file 0100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010… #
A typical file 0100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010… #i
A typical file 0100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010… #inc
A typical file 0100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010100101010011100101111010110101010101010011010101010101010101010110110100101010101001001010010101010101010101010… #include<stdio.h>
An ASCII File • Need to know the “format” of the file. • In this case, the format is: • 1st number=time • 2nd number=temp • 3rd number=dewp 0000 34.5 30.9 0100 33.9 30.8 0200 33.1 30.7 0300 32.7 30.0 0400 31.5 30.0 0500 31.0 29.8
An ASCII File • This file looks like some kind of table… 0000 34.5 30.9 0100 33.9 30.8 0200 33.1 30.7 0300 32.7 30.0 0400 31.5 30.0 0500 31.0 29.8
An ASCII File • …but it is really a “file”—lots of numbers and symbols all lined up. 0000 34.5 30.9<newline>0100 33.9 30.8<newline>0200 33.1 30.7<newline>0300<newline>32.7<newline>30.0<newline>0400 31.5 30.0<newline>0500 31.0 29.8
An ASCII File • To read this file, the computer must “scan” through the file. • Values in the file are separated by “tokens”, typically spaces. 0000 34.5 30.9 0100 33.9 30.8 0200 33.1 30.7 0300 32.7 30.0 0400 31.5 30.0 0500 31.0 29.8
An ASCII File • To read the first value: • Must know that it is going to be an integer. • Reads “0”, “0”, “0”, and “0”. 0000 34.5 30.9 0100 33.9 30.8 0200 33.1 30.7 0300 32.7 30.0 0400 31.5 30.0 0500 31.0 29.8 Computes 0x103 + 0x102 + 0x101 + 0x100 = 0
An ASCII File • To read the second value: • Must know that it is going to be a float. • Reads “3”, “4”, “.”, and “5”. 0000 34.5 30.9 0100 33.9 30.8 0200 33.1 30.7 0300 32.7 30.0 0400 31.5 30.0 0500 31.0 29.8 Computes 3x101 + 4x100 + 5x10-1 = 34.5
Your files are somewhere on the computer’s harddrive. But where? Opening a File
Opening a File • You might there are “territories” on the disk that contain your files.
Opening a File • And all of your files are right there, side by side. Assignment6.c Assignment5.c
Opening a File • But files are really scattered all over the disk, put wherever the operating system could find room for them. Assignment6.c Assignment5.c
Opening a File • Therefore, to open a file, you are going to need the “address” of the file on the harddrive. • Fortunately, there is a C function that gives this to you!
Opening a File • fin = fopen(“weather.dat”,”r”); • The function is “fopen”, for “file open”. • It has two “arguments”— • The first argument is the name of the file to open. • The second argument is the action you are going to take: • r = “read”, w = “write”
Opening a File • fin = fopen(“weather.dat”,”r”); • The function returns the address of this file on the harddrive. • In this case, the address of the file is being stored in a variable called “fin”—for “input file”, but you could call it anything.
Opening a File • What “type” of variable is fin? • FILE *fin; • FILE, in contrast to float or int.
Opening a File • What “type” of variable is fin? • FILE *fin; Notice that there is an asterisk in front of the name of the variable when you declare it. That means that fin is a “pointer” to a file.
Opening a File • An example program. • Notice that the file is eventually closed with fclose. main () { FILE *fin; fin = fopen(“weather.dat”,”r”); fclose (fin); }
Reading a File • Reading from the keyboard: scanf • Reading from a file: fscanf
scanf scanf(“%d”,&time); fscanf Reading a File
scanf scanf(“%d”,&time); fscanf fscanf(fin,”%d”,&time); Reading a File
scanf scanf(“%d”,&time); fscanf fscanf(fin,”%d”,&time); One additional argument—the address of the file you are reading! Reading a File
Reading a File • We use fscanf to read in the values of time, temp, and dewp. main () { FILE *fin; int time; float temp,dewp; fin = fopen(“weather.dat”,”r”); fscanf (fin,”%d”,&time); fscanf (fin,”%f”,&temp); fscanf (fin, %f”,&dewp); fclose (fin); }
Reading a File • Could all be done in one fscanf statement, if you wanted. main () { FILE *fin; int time; float temp,dewp; fin = fopen(“weather.dat”,”r”); fscanf (fin,”%d %f %f”, &time,&temp,&dewp); fclose (fin); }
Reading a File • To read six observations, this will need to be in a loop. • Don’t open and close the file multiple times! main () { FILE *fin; int time,i; float temp,dewp; fin = fopen(“weather.dat”,”r”); for(i=0;i<5;i++) { fscanf (fin,”%d %f %f”, &time,&temp,&dewp); } fclose (fin); }
Writing a File • Never read and write from the same file! • Writing a file that already exists clobbers the old version of the file, so be careful!
printf printf(“%d”,time); fprintf Writing a File
printf printf(“%d”,time); fprintf fprintf(fout,“%d”,time); Writing a File
printf printf(“%d”,time); fprintf fprintf(fout,“%d”,time); Only one additional argument, the address of the file you are writing! Writing a File
Writing a File • The file you are writing will be ASCII, meaning that you can look at it in vi or pico, to see if your program is working.
Your Assignment • Make a copy of the decoded.data file from the ~schragej directory. • Contains ten observations. • WARNING: Wind speed is in knots!
Your Assignment • For each of the ten observations: • Read the observation from the file. • Use your metcalc.c library to compute relative humidity, potential temperature, and wind chill. • Write these results to a file called my.output. • Due Friday, February 13