home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / ctutor1.zip / CHAP10.TXT < prev    next >
Text File  |  1989-11-10  |  17KB  |  411 lines

  1.  
  2.  
  3.  
  4.  
  5.                                                    Chapter 10
  6.                                             FILE INPUT/OUTPUT
  7.  
  8.  
  9. OUTPUT TO A FILE
  10. ____________________________________________________________
  11.  
  12. Load and display the file named FORMOUT.C for   =============
  13. your first example of writing data to a file.     FORMOUT.C
  14. We begin as before with the include statement   =============
  15. for STDIO.H, then define some variables for
  16. use in the example including a rather strange
  17. looking new type.
  18.  
  19. The type FILE is used for a file variable and is defined in
  20. the STDIO.H file.  It is used to define a file pointer for use
  21. in file operations.  The definition of C requires a pointer
  22. to a FILE type to access a file, and as usual, the name can
  23. be any valid variable name.
  24.  
  25.  
  26. OPENING A FILE
  27. ____________________________________________________________
  28.  
  29. Before we can write to a file, we must open it.  What this
  30. really means is that we must tell the system that we want to
  31. write to a file and what the filename is.  We do this with the
  32. fopen() function illustrated in line 11 of the program.  The
  33. file pointer, fp in our case, points to the file and two
  34. arguments are required in the parentheses, the filename first,
  35. followed by the file attribute.  The filename is any valid DOS
  36. filename, and can be expressed in upper or lower case letters,
  37. or even mixed if you so desire.  It is enclosed in double
  38. quotes.  For this example we have chosen the name
  39. TENLINES.TXT.  This file should not exist on your disk at this
  40. time.  If you have a file with this name, you should change
  41. its name or move it because when we execute this program, its
  42. contents will be erased.  If you don't have a file by this
  43. name, this program will create one and put some data into it.
  44.  
  45.  
  46.  
  47. READING ("r")
  48. ____________________________________________________________
  49.  
  50. The second parameter is the file attribute and can be any of
  51. three letters, "r", "w", or "a", and must be lower case. 
  52. There are actually additional attributes available in C to
  53. allow more flexible I/O.  When an "r" is used, the file is
  54. opened for reading, a "w" is used to indicate a file to be
  55. used for writing, and an "a" indicates that you desire to
  56. append additional data to the data already in an existing
  57. file.  Opening a file for reading requires that the file
  58.  
  59.                                                     Page 10-1
  60.  
  61.                                Chapter 10 - File Input/Output
  62.  
  63. already exist.  If it does not exist, the file pointer will
  64. be set to NULL and can be checked by the program. 
  65.  
  66.  
  67. WRITING ("w")
  68. ____________________________________________________________
  69.  
  70. When a file is opened for writing, it will be created if it
  71. does not already exist and it will be reset if it does
  72. resulting in deletion of any data already there. 
  73.  
  74.  
  75. APPENDING ("a")
  76. ____________________________________________________________
  77.  
  78. When a file is opened for appending, it will be created if it
  79. does not already exist and it will be initially empty.  If it
  80. does exist, the data input point will be the end of the
  81. present data so that any new data will be added to any data
  82. that already exists in the file.
  83.  
  84.  
  85. OUTPUTTING TO THE FILE
  86. ____________________________________________________________
  87.  
  88. The job of actually outputting to the file is nearly identical
  89. to the outputting we have already done to the standard output
  90. device.  The only real differences are the new function names
  91. and the addition of the file pointer as one of the function
  92. arguments.  In the example program, fprintf() replaces our
  93. familiar printf() function name, and the file pointer defined
  94. earlier is the first argument within the parentheses.  The
  95. remainder of the statement looks like, and in fact is
  96. identical to, the printf() statement.
  97.  
  98.  
  99. CLOSING A FILE
  100. ____________________________________________________________
  101.  
  102. To close a file, you simply use the function fclose() with the
  103. file pointer in the parentheses.  Actually, in this simple
  104. program, it is not necessary to close the file because the
  105. system will close all open files before returning to DOS.  It
  106. would be good programming practice for you to get in the habit
  107. of closing all files in spite of the fact that they will be
  108. closed automatically, because that would act as a reminder to
  109. you of what files are open at the end of each program.
  110.  
  111. You can open a file for writing, close it, and reopen it for
  112. reading, then close it, and open it again for appending, etc. 
  113. Each time you open it, you could use the same file pointer,
  114. or you could use a different one.  The file pointer is simply
  115. a tool that you use to point to a file and you decide what
  116. file it will point to.
  117.  
  118.                                                     Page 10-2
  119.  
  120.                                Chapter 10 - File Input/Output
  121.  
  122.  
  123. Compile and run this program.  When you run it, you will not
  124. get any output to the monitor because it doesn't generate any. 
  125. After running it, look at your directory for a file named
  126. TENLINES.TXT and examine it's contents.  That is where your
  127. output will be.  Compare the output with that specified in the
  128. program.  It should agree.
  129.  
  130. Do not erase the file named TENLINES.TXT yet.  We will use it
  131. in some of the other examples in this chapter.
  132.  
  133.  
  134. OUTPUTTING A SINGLE CHARACTER AT A TIME
  135. ____________________________________________________________
  136.  
  137. Load the next example file, CHAROUT.C, and      =============
  138. display it on your monitor.  This program         CHAROUT.C
  139. will illustrate how to output a single          =============
  140. character at a time.
  141.  
  142. The program begins with the include statement, then defines
  143. some variables including a file pointer.  The file pointer is
  144. named point this time, but we could have used any other valid
  145. variable name.  We then define a string of characters to use
  146. in the output function using a strcpy() function.  We are
  147. ready to open the file for appending and we do so with the
  148. fopen() function, except this time we use the lower cases for
  149. the filename.  This is done simply to illustrate that DOS
  150. doesn't care about the case of the filename.  Notice that the
  151. file will be opened for appending so we will add to the lines
  152. inserted during the last program.
  153.  
  154. The program is actually two nested for loops.  The outer loop
  155. is simply a count to ten so that we will go through the inner
  156. loop ten times.  The inner loop calls the function putc()
  157. repeatedly until a character in the string named others is
  158. detected to be a zero.
  159.  
  160.  
  161.  
  162. THE putc() FUNCTION
  163. ____________________________________________________________
  164.  
  165. The part of the program we are interested in is the putc()
  166. function in line 16.  It outputs one character at a time, the
  167. character being the first argument in the parentheses and the
  168. file pointer being the second and last argument.  Why the
  169. designer of C made the pointer first in the fprintf()
  170. function, and last in the putc() function is a good question
  171. for which there may be no answer.  It seems like this would
  172. have been a good place to have used some consistency.
  173.  
  174. When the textline others is exhausted, a newline is needed
  175. because a newline was not included in the definition above. 
  176.  
  177.                                                     Page 10-3
  178.  
  179.                                Chapter 10 - File Input/Output
  180.  
  181. A single putc() is then executed which outputs the \n
  182. character to return the carriage and do a linefeed.
  183.  
  184. When the outer loop has been executed ten times, the program
  185. closes the file and terminates.  Compile and run this program
  186. but once again there will be no output to the monitor. 
  187.  
  188. Following execution of the program, examine the contents of
  189. the file named TENLINES.TXT and you will see that the 10 new
  190. lines were added to the end of the 10 that already existed. 
  191. If you run it again, yet another 10 lines will be added.  Once
  192. again, do not erase this file because we are still not
  193. finished with it. 
  194.  
  195.  
  196. READING A FILE
  197. ____________________________________________________________
  198.  
  199. Load the file named READCHAR.C and display it  ==============
  200. on your monitor.  This is our first program      READCHAR.C
  201. which can read from a file.                    ==============
  202.  
  203. This program begins with the familiar
  204. include, some data definitions, and the file opening statement
  205. which should require no explanation except for the fact that
  206. an "r" is used here because we want to read from this file. 
  207. In this program, we check to see that the file exists, and if
  208. it does, we execute the main body of the program.  If it
  209. doesn't exist, we print a message and quit.  If the file does
  210. not exist, the system will set the pointer equal to NULL which
  211. we can test.
  212.  
  213. The main body of the program is one do while loop in which a
  214. single character is read from the file and output to the
  215. monitor until an EOF (end of file) is detected from the input
  216. file.  The file is then closed and the program is terminated.
  217.  
  218.  
  219. CAUTION  CAUTION  CAUTION
  220. ____________________________________________________________
  221.  
  222. At this point, we have the potential for one of the most
  223. common and most perplexing problems of programming in C.  The
  224. variable returned from the getc() function is a character, so
  225. we can use a char variable for this purpose.  There is a
  226. problem that could develop here if we happened to use an
  227. unsigned char however, because C returns a minus one for an
  228. EOF which an unsigned char type variable is not capable of
  229. containing.  An unsigned char type variable can only have the
  230. values of zero to 255, so it will return a 255 for a minus
  231. one.  This is a very frustrating problem to try to find.  The
  232. program can never find the EOF and will therefore never
  233. terminate the loop.  This is easy to prevent, always use a
  234. char type variable for use in returning an EOF.
  235.  
  236.                                                     Page 10-4
  237.  
  238.                                Chapter 10 - File Input/Output
  239.  
  240.  
  241. There is another problem with this program but we will worry
  242. about it when we get to the next program and solve it with the
  243. one following that.
  244.  
  245. After you compile and run this program and are satisfied with
  246. the results, it would be a good exercise to change the name
  247. of TENLINES.TXT and run the program again to see that the NULL
  248. test actually works as stated.  Be sure to change the name
  249. back because we are still not finished with TENLINES.TXT.
  250.  
  251.  
  252.  
  253. READING A WORD AT A TIME
  254. ____________________________________________________________
  255.  
  256. Load and display the file named READTEXT.C     ==============
  257. for an example of how to read a word at a        READTEXT.C
  258. time.                                          ==============
  259.  
  260. This program is nearly identical to the last
  261. except that this program uses the fscanf() function to read
  262. in a string at a time.  Because the fscanf() function stops
  263. reading when it finds a space or a newline character, it will
  264. read a word at a time, and display the results one word to a
  265. line.  You will see this when you compile and run it, but
  266. first we must examine a programming problem.
  267.  
  268.  
  269.  
  270. THIS IS A PROBLEM
  271. ____________________________________________________________
  272.  
  273. Inspection of the program will reveal that when we read data
  274. in and detect the EOF, we print out something before we check
  275. for the EOF resulting in an extra line of printout.  What we
  276. usually print out is the same thing printed on the prior pass
  277. through the loop because it is still in the buffer named
  278. oneword.  We therefore must check for EOF before we execute
  279. the printf() function.  This has been done in READGOOD.C,
  280. which you will shortly examine, compile, and execute.
  281.  
  282. Compile and execute the original program we have been
  283. studying, READTEXT.C and observe the output.  If you haven't
  284. changed TENLINES.TXT you will end up with "Additional" and
  285. "lines." on two separate lines with an extra "lines."
  286. displayed because of the printf() before checking for EOF. 
  287. Note that some compilers apparently clear the buffer after
  288. printing so you may get an extra blank line instead of two
  289. lines with "lines." on them.
  290.  
  291. Compile and execute READGOOD.C and observe that the extra
  292. "lines." does not get displayed because of the extra check for
  293. the EOF in the middle of the loop.  This was also the problem
  294.  
  295.                                                     Page 10-5
  296.  
  297.                                Chapter 10 - File Input/Output
  298.  
  299. referred to when we looked at READCHAR.C, but  ==============
  300. I chose not to expound on it there because       READGOOD.C
  301. the error in the output was not so obvious.    ==============
  302.  
  303.  
  304.  
  305. FINALLY, WE READ A FULL LINE
  306. ____________________________________________________________
  307.  
  308. Load and display the file READLINE.C for an    ==============
  309. example of reading a complete line.  This        READLINE.C
  310. program is very similar to those we have been  ==============
  311. studying except that we read a complete line
  312. in this example program.
  313.  
  314. We are using fgets() which reads in an entire line, including
  315. the newline character, into a buffer.  The buffer to be read
  316. into is the first argument in the function call, and the
  317. maximum number of characters to read is the second argument,
  318. followed by the file pointer.  This function will read
  319. characters into the input buffer until it either finds a
  320. newline character, or it reads the maximum number of
  321. characters allowed minus one.  It leaves one character for the
  322. end of string NULL character.  In addition, if it finds an
  323. EOF, it will return a value of NULL.  In our example, when the
  324. EOF is found, the pointer named c will be assigned the value
  325. of NULL.  NULL is defined as zero in your STDIO.H file. 
  326.  
  327. When we find that the pointer named c has been assigned the
  328. value of NULL, we can stop processing data, but we must check
  329. before we print just like in the last program.  Last of
  330. course, we close the file.
  331.  
  332.  
  333.  
  334. HOW TO USE A VARIABLE FILENAME
  335. ____________________________________________________________
  336.  
  337. Load and display the program ANYFILE.C for an   =============
  338. example of reading from any file.  This           ANYFILE.C
  339. program asks the user for the filename          =============
  340. desired, reads in the filename and opens that
  341. file for reading.  The entire file is then
  342. read and displayed on the monitor.  It should pose no problems
  343. to your understanding so no additional comments will be made.
  344.  
  345. Compile and run this program.  When it requests a filename,
  346. enter the name and extension of any text file available, even
  347. one of the example C programs.
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.                                                     Page 10-6
  355.  
  356.                                Chapter 10 - File Input/Output
  357.  
  358. HOW DO WE PRINT?
  359. ____________________________________________________________
  360.  
  361. Load the last example program in this          ==============
  362. chapter, the one named PRINTDAT.C for an         PRINTDAT.C
  363. example of how to print.  This program should  ==============
  364. not present any surprises to you so we will
  365. move very quickly through it.
  366.  
  367. Once again, we open TENLINES.TXT for reading and we open PRN
  368. for writing.  Printing is identical to writing data to a disk
  369. file except that we use a standard name for the filename. 
  370. Most C compilers use the reserved filename of PRN that
  371. instructs the compiler to send the output to the printer. 
  372. There are other names that are used occasionally such as LPT,
  373. LPT1, or LPT2.  Check the documentation for your particular
  374. compiler.
  375.  
  376. Some of the newest compilers use a predefined file pointer
  377. such as stdprn for the print file.  Once again, check your
  378. documentation.
  379.  
  380. The program is simply a loop in which a character is read, and
  381. if it is not the EOF, it is displayed and printed.  When the
  382. EOF is found, the input file and the printer output files are
  383. both closed.  Note that good programming practice would
  384. include checking both file pointers to assure that the files
  385. were opened properly.
  386.  
  387. You can now erase TENLINES.TXT from your disk.  We will not
  388. be using it in any of the later chapters.
  389.  
  390.  
  391. PROGRAMMING EXERCISES
  392. ____________________________________________________________
  393.  
  394. 1.   Write a program that will prompt for a filename for a
  395.      read file, prompt for a filename for a write file, and
  396.      open both plus a file to the printer.  Enter a loop that
  397.      will read a character, and output it to the file, the
  398.      printer, and the monitor.  Stop at EOF.
  399.  
  400. 2.   Prompt for a filename to read.  Read the file a line at
  401.      a time and display it on the monitor with line numbers.
  402.  
  403. 3.   Modify ANYFILE.C to test if the file exists and print a
  404.      message if it doesn't.  Use a method similar to that used
  405.      in READCHAR.C.
  406.  
  407.  
  408.  
  409.  
  410.                                                     Page 10-7
  411.