/* * PRINTLINE1 -- Read a file name and print it on the standard output * each line prefixed by the line number * this version uses fgets and fputs (last prints line directly) * * 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 #include #include /* * 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 * * 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 */ 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++); fputs(buf, stdout); } } /* * read a file name from the standard input, * open it, and count characters, words, and lines */ 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; } /* count the characters, etc. */ copyout(fp); /* now close it */ (void) fclose(fp); } putchar('\n'); /* * say goodbye! */ exit(rv); }