Speddy Conzales Geschrieben 3. September 2001 Geschrieben 3. September 2001 Hi, ich habe hier ein kleines Problem. Ich will eine Datei auslesen und dabei nach einem bestimmten Wort suchen (will mir die Anzahl ausgeben lassen, wie häufig das Wort in dem Text vorkommt). Nun sind dort leider Zeilenumbrüche in der Datei (alle 65 Zeichen). Wie muß ich die beim auslesen berücksichtigen? Gibt es da einen Trick oder merkt es das Programm automatisch (also der scanf-Befehl)? Mit welchem Befehl bearbeite ich den die Datei am besten? Geht halt darum, daß ich z.B. nach dem Begiff Wurst suche... wollte das ganze als Char-Variable speichern und dann nachher so suchen lassen... Wer kann mir da weiterhelfen? Thx, wenn jemand was weiß Zitieren
Hasi Geschrieben 3. September 2001 Geschrieben 3. September 2001 also da gibt es mehrere Moeglichkeiten du liest zeichen fuer zeichen ein und fraegst nach dem Zeichen '\n' ab das steht fuer den Zeilenwechsel oder du verwendest getc() das liest immer eine Zeile ein bis zum '\n' zum Vorhanden sein: schau dir mal die Stringmanipulation Routines an ich denke es muesste mit strcspn gehen kleines Beispiel : #include <string.h> #include <stdio.h> void main( void ) { char string[] = "xyzabc"; int pos; pos = strcspn( string, "abc" ); printf( "First a, b or c in %s is at character %d\n", string, pos ); } hoffe ich konnte dir etwas helfen Liebe Gruesse Hasi Zitieren
haddock Geschrieben 4. September 2001 Geschrieben 4. September 2001 Willst du das ganze in nacktem C oder in C++ machen ? In C empfiehlt es sich meisten, die Datei Zeichen für Zeichen zu durchsuchen. Dann wird ein '\n' einfach als normales Zeichen interpretiert und du mußt dir gar keine Gedanken darum machen. Du suchst nach dem ersten Buchstaben im Wort, wenn du ihn findest, schaust du ob der nächste paßt etc. bis dein Wort gefunden ist oder nicht. Höhere Routinen machen intern auch nichts anderes. Der Käptn Zitieren
Shadax Geschrieben 4. September 2001 Geschrieben 4. September 2001 Ich denke, Speddy Conzales wollte doch von einer Datei lesen... char *fgets(char *s, int n, FILE *stream); fgets() aus stdio.h liest maximal n-1 Zeichen nach `s' aus `stream'. Wird ein Zeilenumbruch oder das Dateiende früher entdeckt, werden nur die Zeichen bis zu diesem Zeilenumbruch (bzw. bis zum Dateiende) nach `s' geschrieben (einschliesslich des Zeilenumbruchs). Bei Erfolg wird `s' geliefert, bei Misserfolg ein Null-Zeiger (`s' bleibt dann unberührt). Bespiel: char s[2048]; FILE *f; // ... Datei öffnen ... while( fgets(s, sizeof(s), f) ) { printf("Zeile gelesen: %s", s); } // ... Datei schliessen ... Sobald eine Zeile erfolgreich aus der Datei gelesen wurde, kann mit strcmp() aus string.h nach einer bestimmten Zeichenfolge gesucht werden: int strcmp(const char *s1, const char *s2); Hier: strcmp(s, "Wurst"); strcmp() liefert bei Gleichheit beider Zeichenfolgen 0, bei Ungleicheit wird ein Wert ungleich 0 geliefert: war das erste unterschiedliche Zeichen in s1 grösser, wird ein Wert >0 geliefert, war es kleiner, dann <0. Zitieren
Spike Geschrieben 6. September 2001 Geschrieben 6. September 2001 Hmm ich hab ein ähnliches Problem, bin jetzt aber durcheinander weil ich ein anderes Tutorial durcharbeite. Ich will folgendes erreichen: - .exe aufrufen mit 2 Parametern (Quelldatei, Zieldatei) - die Quelldatei durchparsen und damit in jeder Zeile die 3 anführenden Zeichen rausschneiden - den neuen Inhalt in die Zieldatei schreiben. Das Aufrufen mit den 2 Parametern hab ich hinbekommen, auch kann ich auf die Datei zugreifen, aber irgendwie find ich nicht raus wie man Zeilenweise ausliest und dann direkt die ersten 3 Zeichen jeder Zeile abschneidet ... Dann am Ende alles in die neue Datei schreiben. int main(int argc, char *argv[]) // liefert bei Fehler 1 zurueck { cout << "Uebergeben wurden " << argc << " Argumente...\n"; if (argc != 2) { cout << "Aufruf: " << argv[0] << " " << argv[1] << " " << argv[2] << endl; } //Dateizugriff ifstream fin(argv[1]); // zum Lesen oeffnen if (! fin) { // Öffnen ist gescheitert => Fehlerbehandlung } char ch; char dummy; while (fin.get(ch)) //Zeichenweise einlesen geht, will aber Zeilenweise! { cout << ch; //Inhalt bearbeiten ? und dummy zuweisen dummy = ch; cout << dummy; } fin.close(); Hmm falls einer Zeit hat mir das kurz zu erläutern ... Zitieren
Spike Geschrieben 7. September 2001 Geschrieben 7. September 2001 So für alle die es interessiert, ich bin endlich mit den Pointern klargekommen, ist ne ganz schöne Umgewöhnung ... int main(int argc, char *argv[]) // liefert bei Fehler 1 zurueck { if (argc != 3) { // Parameter fehlen return(2); } FILE *inFile; FILE *outFile; char line[2000]; inFile=fopen(argv[1],"r"); outFile=fopen(argv[2], "w"); if(inFile == NULL || outFile == NULL) return(1); while(fgets(line,2000,inFile )!=NULL) { fprintf(outFile,"%s",line+3); } fclose(inFile); fclose(outFile); return(0); } -------------- Den String musste ich nicht manipulieren, sondern einfach den Pointer + 3 nehmen, dann hatte ich die ersten 3 Zeichen abgeschnitten. Mit fgets() bekommt man eine Zeile, bis zum Zeilenende (\n). Zitieren
Speddy Conzales Geschrieben 9. September 2001 Autor Geschrieben 9. September 2001 Erstmal THX An alle für die tollen Tipps Bringen mich schon richtig weiter Ich habe da nur noch eine Frage... *sorry*, aber wie mache ich das, wenn das gesuchte Wort auf 2 Zeilen aufteilt ist. Also z.B. BlablablablaMilchm aschine Wie kann ich die ganzen Zeilen zu einem langen String oder einer langen Datei zusammen fügen, damit ich diesen Fehler umgehen kann? Zitieren
haddock Geschrieben 12. September 2001 Geschrieben 12. September 2001 s.o. , zeichenweise vorgehen mit 'fgetc(FILE*)'. Du schmeißt einfach alle '\n' s weg, oder zählst sie mit wg. Zeilennummern, und schaust ob die Zeichen hintereinander auf den Suchstring passen. Hab leider grad keine Zeit fürn Beispiel, sorry. Der Käptn Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.