Sitzung: Jeden Freitag ab 14:30 s.t. online. Falls ihr den Link haben wollt, schreibt uns.

C-Kurs/Cat/Musterlösung

< C-Kurs‎ | Cat
#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;
}