ein Kapitel zurück                                           ein Kapitel weiter

Aufgrund häufiger Fragen, will ich hier ein paar Code-Beispiele schreiben, die sie ohne Bedenken Ihren Bedürfnissen anpassen können. Folgende Rezepte stehen Ihnen dabei zur Verfügung :


Wie kann ich die n-te Zeile auslesen?


/*Download:linen.c*/
#include <stdio.h> #define BUF 255 char temp[BUF]; char puffer[BUF]; /*Auslesen der n-ten Zeile*/ char *getsline_number(int n, FILE *file) { int i; for(i=0; i<n-1; i++) if(fgets(temp, BUF, file) == NULL) /*Bis zu n-1ten Zeile lesen*/ return NULL; /*Zeile scheint nicht zu existieren*/ if(fgets(puffer,BUF,file)==NULL) /*Stream ist jetzt in der n-ten Zeile*/ return NULL; /*Zeile scheint nicht zu existieren*/ return puffer; /*Zeile an Aufrufer zurück*/ } int main(int argc, char **argv) { FILE *f; int line; char *linenr; if(argc < 2) { fprintf(stderr, "Verwendung : %s datei\n",*argv); exit(0); } f=fopen(argv[1],"r"); if(f == NULL) { perror("Fehler beim öffnen"); exit(0); } printf("Welche Zeile wollen sie lesen : "); scanf("%d",&line); linenr=getsline_number(line, f); if(linenr == NULL) { fprintf(stderr, "Fehler beim Lesen der %d-ten Zeile??\n"); exit(0); } printf("Zeile %d : %s\n",line,linenr); return 0; }

Wie kann ich ich von Zeile n1 bis n2 lesen?


/*Download:linen2n.c*/
#include <stdio.h> #define BUF 255 char temp[BUF]; char puffer[BUF]; int i; /*Zeilenzaehler*/ /*Lesen von Zeile n1 bis Zeile n2*/ char *getsline_number(int n1,int n2, FILE *file) { for(i=0; i<n1-1; i++) if(fgets(temp, BUF, file) == NULL)/*Bis zu n1-ten Zeile lesen*/ return NULL; /*Zeile scheint nicht zu existieren*/ /*Jetzt beginnt das eigentliche lesen*/ printf("\n\n"); for(i=n1; i<=n2; i++){ if(fgets(puffer,BUF,file)==NULL) /*Stream ist jetzt in der n-ten Zeile*/ return NULL;/*Zeile scheint nicht zu existieren*/ printf("Zeile %d : %s",i,puffer); } } int main(int argc, char **argv) { FILE *f; int line1,line2; char *linenr; if(argc < 2) { fprintf(stderr, "Verwendung : %s datei\n",*argv); exit(0); } f=fopen(argv[1],"r"); if(f == NULL) { perror("Fehler beim öffnen"); exit(0); } printf("von Zeile wollen sie lesen : "); scanf("%d",&line1); printf("bis Zeile wollen sie lesen : "); scanf("%d",&line2); if(line2<line1) { fprintf(stderr, "bis Zeile kann nicht grösser sein wie von Zeile!\n"); exit(0); } linenr=getsline_number(line1,line2, f); if(linenr == NULL) { fprintf(stderr, "Fehler beim Lesen der %d-ten Zeile??\n",i); exit(0); } printf("\n"); return 0; }

Wie kann ich alle Zeilen ausgeben die ein bestimmtes Wort enthalten?


/*Download:search1.c*/
#include <stdio.h> #define BUF 255 int main(int argc, char **argv) { FILE *f; char searchstring[BUF]; char puffer[BUF]; int counter=1; if(argc < 2) { fprintf(stderr, "Verwendung : %s datei\n",*argv); exit(0); } f=fopen(argv[1],"r"); if(f == NULL) { perror("Fehler beim öffnen"); exit(0); } printf("Wonach suchen sie in %s : ",argv[1]); scanf("%s",searchstring); printf("\n"); while(fgets(puffer, BUF, f) != NULL) { if(strstr(puffer,searchstring) != NULL) printf("Zeile %d : %s",counter,puffer); counter++; } printf("\n"); return 0; }

Der Nachteil an diesem Beispiel ist das strstr praktisch alle Stringfolgen ausgibt. Beispielsweise sie suchen nach der Stringfolge int, gibt strstr auch als wahr an wenn die Folge printf, fprintf, Lint, Mint.... ist. Wenn dies so gewollt ist dies Ok. Falls nicht müssen wir mittels strtok einen Worttrenner einbauen..........

Wie kann ich alle Zeilen ausgeben die ein bestimmtes Wort enthalten?


/*Download:search2.c*/
#include <stdio.h> #define BUF 255 char trennzeichen[] = ".;,:\"\' "; int main(int argc, char **argv) { FILE *f; char searchstring[BUF]; char puffer[BUF],puffer_bak[BUF]; int counter=1; char *wort; if(argc < 2) { fprintf(stderr, "Verwendung : %s datei\n",*argv); exit(0); } f=fopen(argv[1],"r"); if(f == NULL) { perror("Fehler beim öffnen"); exit(0); } printf("Wonach suchen sie in %s : ",argv[1]); scanf("%s",searchstring); printf("\n"); while(fgets(puffer, BUF, f) != NULL) { strcpy(puffer_bak,puffer); wort=strtok(puffer,trennzeichen); while(wort != NULL){ if(strcmp(wort,searchstring) == 0) printf("Zeile %d : %s",counter,puffer_bak); wort=strtok(NULL,trennzeichen); } counter++; } printf("\n"); return 0; }

Suchen und Ersetzen in einer Textdatei (Nur ganze Worte, keine Teilstrings)


/*Download:replace.c*/
#include <stdio.h> #include <string.h> #include <ctype.h> #define STRING_MAX 8192 int wort_begrenzer(char c) { return (c == ' ' || c == '\n' || c == '\t' || c == '\0' || c == '.' || c == ',' || c == ';' || c == '!' || c == '?'); } int main(int argc, char **argv) { FILE *file, *copy; char alt_string[STRING_MAX+1],neu_string[STRING_MAX+1], such_wort[STRING_MAX+1],replace_wort[STRING_MAX+1], *zgr, antwort; char puffer[STRING_MAX+1]; int such_wortlen, i=0,w; if(argc < 2) { fprintf(stderr,"Verwendung: %s datei\n",*argv); exit(0); } file=fopen(argv[1],"r"); /*Datei zum Lesen öffnen*/ copy=fopen(argv[1],"r+"); /*Datei zum Schreiben öffnen*/ if(file == NULL || copy == NULL) { perror("Fehler beim öffnen"); exit(0); } alt_string[0]='\0'; /*Kompletten String in alt_string legen..... */ /*Bitte selbst durch dynamische Speicherverwaltung für genügend Platz */ /* schaffen!!!!!!!!!!!!!!*/ while( (fgets(puffer,STRING_MAX+1,file)) != NULL) strcat(alt_string, puffer); neu_string[0]='\0'; printf("Welches Wort wollen sie ersetzten : "); gets(such_wort); /*Gefährlich aber einfacher wegen Wortbegrenzung*/ such_wortlen=strlen(such_wort); /*Länge des Suchwortes*/ for(w=0; w<such_wortlen; w++) if(wort_begrenzer(such_wort[w])) /*Nach Wortbegrenzern duchlaufen...*/ { printf("Keine Wortbegrenzer bitte\n"); exit(0); } printf("Durch welches Wort wollen sie ersetzen : "); gets(replace_wort); /*Gefährlich aber einfacher..........*/ i=0; while(1) { if( (zgr=strstr(&alt_string[i], such_wort)) == NULL) { /*Kein Wort zu ersetzen*/ strcat(neu_string, &alt_string[i]); break; } else { /*..ansonsten von Byte i bis zgr in neu_string*/ strncat(neu_string, &alt_string[i], zgr-&alt_string[i]); /*Jetzt überprüfen ob wir ein Wort haben und keinen Teilstring oder das Wort am Anfang steht*/ if( (zgr-&alt_string[0]==0 || wort_begrenzer( *(zgr-1))) && wort_begrenzer( *(zgr+such_wortlen))) { strcat(neu_string, replace_wort); /*Nach Ersetzem Wort den Zeiger setzen......*/ i+=zgr+such_wortlen-&alt_string[i]; } else { strncat(neu_string, zgr, 1); i+=zgr+1-&alt_string[i]; } } }/*Ende while(1)*/ /*Für Testausgabe bitte Kommentare entfernen*/ /*printf("Neuer String : %s\n",neu_string);*/ strcpy(alt_string, neu_string); /*Achtung jetzt wirds ernst, für Testausgabe in Kommetare setzen*/ fputs(alt_string,copy); neu_string[0] = '\0'; return 0; }

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf