C-Kurs/Cat/Musterlösung: Unterschied zwischen den Versionen
Mutax (Diskussion | Beiträge) K (hat „Ckurs2009/Cat/Musterlösung“ nach „Ckurs/Cat/Musterlösung“ verschoben: Aufgaben sind Kurs übergreifend nutzbar) |
PaulG (Diskussion | Beiträge) K (verschob „Ckurs/Cat/Musterlösung“ nach „C-Kurs/Cat/Musterlösung“) |
(kein Unterschied)
|
Aktuelle Version vom 5. März 2013, 17:37 Uhr
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LNUMBERS (1<<0) #define SHOWENDS (1<<1) void usage(){ printf("mycat <option> <file>:\n" "-n\tshow line numbers\n" "-E\tprint $ at the end of each line" "-h\tthis help\n"); exit(EXIT_SUCCESS); } int print_file(char *fname, unsigned int opts){ FILE *f = NULL; char buf[1024]; unsigned long lnumber = 1; char format[10]; if(NULL == (f = fopen(fname, "r"))){ perror("fopen()"); return -1; } /* of course it would be better to read the file block-wise but for simplicity we assume lines aren't longer than 1024 chars */ while(fgets(buf, sizeof(buf), f) && !feof(f)){ if(opts & LNUMBERS) printf("%5lu ", lnumber++); if(opts & SHOWENDS){ buf[strlen(buf) - 1] = 0; snprintf(format, sizeof format, "%s", "%s$\n"); } else snprintf(format, sizeof format, "%s", "%s"); printf(format, buf); } return 0; } int main(int argc, char **argv){ int i; unsigned int options = 0; char *file = NULL; if(argc < 2){ usage(); } for(i = 1; (i + 1 < argc) && argv[i][0] == '-'; i++){ switch(argv[i][1]){ case 'n': options |= LNUMBERS; break; case 'E': options |= SHOWENDS; break; case 'h': usage(); break; default: usage(); break; } } file = argv[argc - 1]; if(print_file(file, options) < 0){ printf("There was an error opening your file\n"); return -1; } return 0; }