Woodstock Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 Gibt es in C++ eine Mglichkeit die Zeilen in einer Datei Zählen zu lassen? Also eine Funktion dafür, oder einen Befehl? Bine Zitieren
Poldi Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 ich fürchte, eine solche funktion wirst du dir selber implementieren müssen ... :WD Zitieren
Peter Pan Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 Zähl einfach die "\n" in Deiner Datei ( z.B. mit fgetc(...) ) Zitieren
Woodstock Geschrieben 30. Januar 2002 Autor Geschrieben 30. Januar 2002 Hmm, so einfach ist das leider nicht. Ich will dann sagen können, gib mir das aus Zeiel xy aus. Schade. Naja, dann wird das eben auch noch ein etwas größerer Aufwand. Bine Zitieren
Poldi Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 lies doch einfach die datei zeilenweise ein und speicher jede zeile in einem vector<string>. dann hast du zwar die komplette datei im arbeitsspeicher, kannst dann aber auch die zeilen direkt ansprechen. kommt halt auch mit drauf an, wie groß die datei ist. ein vektor ist sowas wie ein array. Zitieren
Woodstock Geschrieben 30. Januar 2002 Autor Geschrieben 30. Januar 2002 Das ist bei an die 15000 Zeilen aber nicht so lustig. Bine Zitieren
-= *["]Mr.Coffee["]* =- Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 ich hab sowas schonmal zum download gesehen. weiss aber nicht genau ob des ne cpp war, oder ne erweiterung für Microsoft Visual C++ ich schau mal nach ob ich des nochmal finde. Gruß Johannes Zitieren
Poldi Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 Original geschrieben von Woodstock Das ist bei an die 15000 Zeilen aber nicht so lustig. Bine kommt auf deinen rechner an ... ich mach das mit 20 mb dateien ... die haben teilweise über 130.000 Zeilen. ausprobieren. Zitieren
Woodstock Geschrieben 30. Januar 2002 Autor Geschrieben 30. Januar 2002 Ok, mache ich! Danke! Bine PS: Was würde ich nur ohne Dich tun? Du hast mir schon so oft geholfen. Zitieren
-= *["]Mr.Coffee["]* =- Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 ich glaub ich hab was gefunden das euch vielleicht weiterhelfen könnte. (hoffe ich doch) hier der link: http://www.computerchannel.de/download/dl_detailseite3_db.phtml?progid=3090 Gruß Johannes Zitieren
gajUli Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 Wenn man nicht aus perfomance-Gruenden die Datei cachen muss, sollte man solche Tools immer so schreiben, dass sie auch bei einer Terabyte-Datei funktionieren, das ist ja nicht wesentlich komplizierter. Uli Zitieren
Woodstock Geschrieben 30. Januar 2002 Autor Geschrieben 30. Januar 2002 @Uli: Bitte was? @Poldi: Wie funktioniert denn das mit dem Vector? Ich versteh das was in der MSDN steht dazu nicht wirklich. Kannst Du mir das einmal erklären? Bine Zitieren
Woodstock Geschrieben 30. Januar 2002 Autor Geschrieben 30. Januar 2002 @Johannes: Nee, das hilft mir nicht, weil es keine Code Datei ist. Kurz zur Erklärung: Ich habe da ein Programm welches mir alle Textdateien die auf der Festplatte vorhanden sind sucht, öffnet und Wort für Wort ausliest. Dieses Programm schreibt die Wörter in eine Datei, und die Pfadangaben in eine Andere. Die Pfadangabe wird nur einmal die die Datei geschrieben -> Wird der gleiche Pfad nochmal angegeben wird er trotzdem nicht in die Datei geschreiben. Zu dem werden hinter die Wörter Zahlen geschreiben. Nämlich im Grunde genommen die Zeilenzahlen der PfadangabeDatei. Beispiel: 1. Datei: Bla 1 5 Blubb 2 4 5 Hallo 3 4 2. Datei: c:\Hallo.txt c:\bal.txt c:\windows\bal.txt c:\personal\Texte\Blubb.txt c:\personal\Briefe\Holla.txt Jetzt will ich nach den bestimmten Wörtern suchen lassen (welche der User angeben können soll), sagen wir mal Blubb. Ich durchsuche also meine erste Datei, und siehe da, das Wort Blubb kommt in der Datei c:\bla.txt, c:\personal\Texte\Blubb.txt und der c:\personal\Briefe\Holla.txt vor. Und jetzt will ich eben ausgeben lassen: Das Wort Blubb kommt vor in: c:\bla.txt, c:\personal\Texte\Blubb.txt und der c:\personal\Briefe\Holla.txt Und dafür passt das Programm nicht wirklich was da zum download angeboten wird. Bine Zitieren
paule22 Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 moin, geht das nicht mit schlichten ANSI-C Befehlen ??? also in etwa so: while (fgets(buffer,buffer_laenge,file_streamA) != NULL) { if (sscanf("%s %d %d",&wort, &data_A, &data_ == 2) { if (!strcmp(wort,suche_wort)) { int a; for (a = 0; a < data_A; a++) fgets(bufferA,buffer_len,file_streamB) int b; for (a = 0; a < data_A; a++) fgets(bufferA,buffer_len,file_streamB) printf("Datei-A: %s", bufferA); printf("Datei-B: %s", bufferB); break; } } } man müsste das ganze nur dynamisch irgendwie machen ??? hoffe das hilft Zitieren
Poldi Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 das mit den vektoren funktioniert so: void main() { vector<string> datenVec; string zeile; einlesen (ein mal über jede input zeile) { zeile = eingelesene zeile; datenVec.push_back(zeile); } // anzahl zeilen ausgeben: cout << "Es wurden " << datenVec.size() << " Zeilen eingelesen\n"; } Vektoren sind, wie gesagt, sowas wie arrays. einfache Vektoren sind zweidimensional: datenVec[0] = "das ist der text der ersten zeile" datenVec[1]= "das ist der text der zweiten zeile" direkt auf elemente eines vektors kannst du so wie oben zugreifen, mit eckigen klammern. mach dir da aber lieber ne funktion für, denn wenn du auf ein element zugreifen willst, das außerhalb des vektors liegt, schmiert der ab. also vorher gucken ob gewünschtes element kleiner größe des vektors ist. und mach dir mal keinen kopp, ich helf dir gerne ... ;o) Zitieren
Poldi Geschrieben 30. Januar 2002 Geschrieben 30. Januar 2002 und immer brav push back benutzen, weil der dann automatisch speicher reserviert, dann mußt du keine größe bei der deklaration mit angeben. übrigens kannste vektoren auch verschachteln, kann mitunter nützlich sein: vector< vector<string> > Zitieren
Woodstock Geschrieben 30. Januar 2002 Autor Geschrieben 30. Januar 2002 Ok, schon mal ein Ansatz (für mich). Aber so wirklich habe ich das immer noch nicht. Also, wenn ich jetzt die erste Zeile aus der Datei xy.tyt auslesen und in einem Vector (muss ich dem einen Namen geben? wie definiere ich den vector?) an der Stelle vecotr[0] speichern will, wie muss ich das machen. Kann ich zum Auslesen weiterhin fgets benutzen? Wenn ja, gebe ich da dann den Vector inkl. der Position (also vector[?]) als das an wo er da speichern soll? Und wie ist das mit dem Speicher? Muss ich da vorher keine Größe angeben? Muss ich das also dynamisch machen? Fragen über Fragen! Bine Zitieren
Poldi Geschrieben 31. Januar 2002 Geschrieben 31. Januar 2002 nein, du mußt keine größe mit angeben. einfach nur vector<typ> vektorname wenn du dann einen vector vom typen string hast, kannst du auch nur strings anhängen ... soll heißen, wenn du eine zeile mit fgets eingelesen hast, hast du ja n char*, den umwandeln in String, dann an den Vektoren anhängen. vector<string> datenVektor; // Vektor in dem die Datei gespeichert wrd string zeilenString; // String der an Vektor gehängt wird char zeile[800]; // Char Array in den Zeile eingelesen wird // Einlesen der Datei (zeilenweise): while ! EOF mach fgets(zeile,....) { // eingelesene Zeile in String kopieren zeilenString = zeile; // den String anhängen datenVektor.push_back(zeilenString); } Die Methode push_back reserviert Speicher für dich. Sie hängt den String (die eingelesene Zeile) immer an das Ende de Vektors. Wenn du eine Zeile wieder rausholen willst, mußt du direkt auf den Vektor zugreifen: string bla; // hierin wird die Zeile aus dem Vektor gespeichert // speichern von Zeile 10: bla = datenVektor[9]; 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.