aboutsummaryrefslogtreecommitdiff
path: root/ch8/8-03_fflush-and-fclose.c
blob: add2318b2f8574cb1cc82ee62da226da71c36669 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include "syscalls.h"
/* The C Programming Language: 2nd Edition
 *
 * Exercise 8-3: Design and write `_flushbuf`, `fflush`, and `fclose`.
 *
 * Notes: Not much guidance here, eh? :) We'll want to consult manpages.
 *
 * _flushbuf returns 0 on success, -1 on failure.
 * fflush flushes a buffer, or *all* buffers
 * fclose does housekeeping on _iob members so fds can be juggled
 *
 * Since work done in these exercises is predominantly in a header file, the
 * final implementation is used for all exercises that rely on it. Attempts
 * have been made to demonstrate *what* is being done, but it's difficult to do
 * so without creating side effects inside the buffers themselves. Trust that
 * if this file outputs its own source, everything is fine.
 */

int main() {
	/* Let's copy 8-2's exercise but get a different look on the buffer. */
	/* show the contents of buffers before and after flush */
	FILE *fp = fopen("8-03_fflush-and-fclose.c", "r");
	if (fp != NULL) {
		char c;
		while ((c = getc(fp)) != EOF) {
			putchar(c);
		}
		/* fclose calls fflush */
		fclose(fp);
		fclose(stdout);
	} else {
		puts("Could not open file for reading.");
	}
	return 0;
}