Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Zeilenzähler???

Empfohlene Antworten

Veröffentlicht

Gibt es in C++ eine Mglichkeit die Zeilen in einer Datei Zählen zu lassen? Also eine Funktion dafür, oder einen Befehl?

Bine

ich fürchte, eine solche funktion wirst du dir selber implementieren müssen ... :WD

Zähl einfach die "\n" in Deiner Datei ( z.B. mit fgetc(...) )

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

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.

Das ist bei an die 15000 Zeilen aber nicht so lustig.

Bine

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

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.

Ok, mache ich!

Danke!

Bine

PS: Was würde ich nur ohne Dich tun? Du hast mir schon so oft geholfen.

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

@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

@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

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_B) == 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

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)

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> >

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

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];

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.