A program can open and close, and read from, and write to, a file that is defined by the user
This is generally done when you have
- large volumes of stored data, or
- complex data (such as structs) or
- non-printable data
These don't happen often. Nevertheless, for the sake of completeness, here is a program that
-
reads a number from a file input.txt
-
writes the count from 1 to that number to the file output.txt
-
it is user-friendly
: it tells the user that an output file has been created
-
// files.c
// read a number 'num' from a file input.txt
// write a count from 1 to 'num' to the file OUT
#define IN "input.txt"
#define OUT "output.txt"
#include <stdio.h>
#include <stdlib.h>
#define NUMDIG 6 // size of numerical strings that are output
int main(void) {
FILE *fpi, *fpo; // these are file pointers
char s[NUMDIG];
fpi = fopen(IN, "r");
if (fpi == NULL) { // an important check
fprintf(stderr, "Can't open %s\n", IN);
return EXIT_FAILURE;
}
else {
int num;
if (fscanf(fpi, "%d", &num) != 1) { // an important check
fprintf(stderr, "No number found in %s\n", IN);
return EXIT_FAILURE;
}
else {
fclose(fpi); // don't need the input file anymore
fpo = fopen(OUT, "w");
if (fpo == NULL) { // an important check
fprintf(stderr, "Can't create %s!\n", OUT);
return EXIT_FAILURE;
}
else { // got input and got an output file
fprintf(fpo, "%s", "Counts\n");
for (int i=1; i<=num; i++) {
sprintf(s, "%d", i);
fprintf(fpo, "%s\n", s);
}
fclose(fpo);
printf("file %s created\n", OUT);
return EXIT_SUCCESS;
}
}
}
}
input.txt
10
output.txt
prompt$ dcc files.c prompt$ ./a.out file output.txt created prompt$ more output.txt Counts 1 2 3 4 5 6 7 8 9 10 11 12 13