/* * PRINTLINE2 -- Read a file name and print it on the standard output * each line prefixed by the line number * this version uses fgets and fputc, looping through the array * * Usage: printfile1 * * Inputs: file names; EOF to exit * Output: contents of file, each line prefixed by line number * Exit Code: number of files it could not open * * Matt Bishop, ECS 36A, Fall 2019 * * Oct. 22, 2015 -- original program written * Oct. 23, 2019 -- modified for ECS 36A */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* * useful macros */ #define MAXFILENAMESIZE 1024 /* maximum length of file name */ #define MAXLINELENGTH 1000 /* maximum line length */ /* * COPYOUT -- copy the contents of a file to standard output using putchar * * parameters: FILE *fp pointer to file to be copied out * return: none * assumptions: fp points to a file * side effects: prints the line number followed by tab followed by line */ void copyout(FILE *fp) { char buf[MAXLINELENGTH]; /* buffer to hold line */ int i; /* counter in a for loop */ static int lineno = 1; /* current line number */ /* * read until done */ while(fgets(buf, MAXLINELENGTH, fp) != NULL){ /* not done yet so print line number, then line */ printf("%6d\t", lineno++); /* use a for loop to demonstrate sequential access */ for(i = 0; buf[i] != '\0'; i++) putchar(buf[i]); } } /* * read a file name from the standard input, * open it, and print it with line numbers * before each line */ int main(void) { char fname[MAXFILENAMESIZE]; /* the file name(s) */ FILE *fp; /* file pointer */ int rv = 0; /* number of files that couldn't be opened */ /* * read one file name per line, and do the dirty deeds * then get the next one, -, until EOF */ while(printf("file name> "), fgets(fname, MAXFILENAMESIZE, stdin) != NULL){ /* clobber trailing newline */ if (fname[strlen(fname)-1] == '\n') fname[strlen(fname)-1] ='\0'; /* open the file */ if ((fp = fopen(fname, "r")) == NULL){ fprintf(stderr, "Could not open file %s\n", fname); rv++; continue; } /* copy the file, putting line numbers in front of each line */ copyout(fp); /* now close it */ (void) fclose(fp); } putchar('\n'); /* * say goodbye! */ exit(rv); }
|
ECS 36A, Programming & Problem Solving Version of April 2, 2024 at 12:13PM
|
You can get the raw source code here. |