# Zeilenauslesen aus Textdatei



## Lenkwaffe (3. November 2004)

Folgendes:
Ich möchte aus der anhängeden Textdatei nur die Zeilen "Ausgabe: Sxxxxxx" ausgelesen haben, und die Anzahl dieser Zeilen als Summe ausgeben bekommen...Wer kann mir weiterhelfen? 


```
CBEmuIO Version 1.01
CBI4694 V 1.00
Error from:PRT1	 - 32:19Error from:PRT1	 - 32:65benden mit eingabe von <ende>
 
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
```


----------



## MCIglo (3. November 2004)

Ist das Zufall, dass die hier alle gleich sind?


----------



## canuzzi (3. November 2004)

Ein bissel mehr Infos waere von Vortiel! Sieht dein Header immer so aus? Ist der String vor deiner Zahl immer gleich lang? Dann kannst ist es ziemlich einfach, sind sie Variabel, wirds zwar nicht schwierig , aber mann muss ein bischen Stringmatching zusaetlich betreiben.


----------



## Lenkwaffe (3. November 2004)

Also der Header sieht immer gleich aus...die werte "Ausgabe: S" bis zu dem Punkt sind auch immer gleich. Es handelt sich dabei um ean codes die varieren. Jede Zeile beginnt immer mit Ausgabe ab dem Header...aber die größe von dem header ändert sich nicht. die ist immer 3 Zeilen hoch. ich hab mir schon mal gedanken gemacht die einzelnen zeilen nach dem wort ausgabe zu suchen aber ich kann das irgendwie nicht umsetzen, weil es mir an programmier fähigkeit mangelt...


----------



## RedWing (3. November 2004)

Hi versuch es maal hiermit:


```
#include <iostream>
#include <fstream>
#include <sstream>
#include <iterator>

using namespace std;

int main(){

        string *search = new string("Ausgabe:S"); 
        string::size_type begin = 0;
        string::size_type end;
        double sum = 0, current = 0;

        ifstream in("test.txt"); //Datei öffnen
        string *content = new string(istream_iterator<char>(in), istream_iterator<char>()); //Dateiinhalt in String schreiben
        in.close();

        while((begin = content->find(*search, begin)) != string::npos){  //solange bis kein "Ausgabe:S" im string mehr vorhanden ist
                end = content->find(*search, begin + 1);
                istringstream is( content->substr(begin + search->size(), end - (begin + search->size()))); 
                is >> current;  //umwandeln der Zahl die von begin + size("Ausgabe:S") bis end - (begin + size("Ausgabe:S")) in eine double
                sum += current; //aufsummieren der einzelnen Zahlen
                begin += 1;
        }

        cout << sum << endl;
        delete search;
        delete content;
        return 1;
}
```


Der einzige Nachteil an der Methode ist das sämtliche Leerzeilen + Leerzeichen + 
Zeilenumbrüche überlesen werden, aber das sollte in deinem Fall eh keine Rolle spielen.


In diesem Sinne 
Gruß

RedWing


----------



## Lenkwaffe (4. November 2004)

das Programm läuft soweit...ich bin nur mit der ausgabe nicht zufrieden...der zeigt mir stetig den wert 0 an...woran kann das liegen?


----------



## RedWing (4. November 2004)

Hast du vielleicht die doubles in int o. long umgeschrieben?

Deine Zahlenwerte in der Textdatei sind zu groß für einen Integer bzw long...

Ansonsten sollte das programm funktionieren:

Datei:


```
xxx@taco31:~> cat test.txt 
CBEmuIO Version 1.01
CBI4694 V 1.00
Error from:PRT1  - 32:19Error from:PRT1  - 32:65benden mit eingabe von <ende>
 
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
Ausgabe: S4000868700575
```

Ausgabe:


```
xxx@taco31:~> ./a.out 
9.202e+13
```

Gruß

RedWing

P.S. Das ergebniss ist gerundet...


----------



## Lenkwaffe (4. November 2004)

ne ich hab das prog so übernommen wie du es geschrieben hast...
naja das ergebnis stimmt ja auch nicht...es müsst ja laut der textdatei 23 zeilen sein...


----------



## RedWing (4. November 2004)

RedWing hat gesagt.:
			
		

> P.S. Das ergebniss ist gerundet...


 
//edit Exaktes Ergenbinss:

```
xxx@taco31:~> expr 4000868700575 \* 23
92019980113225
```


----------



## Lenkwaffe (4. November 2004)

wenn er mir das ergebnis wenigstens ausgeben würde...aber der gibt immer 0 aus...ich hab dev-c++ als compiler...vielleichts liegst daran...


----------



## RedWing (4. November 2004)

Mhm du kannst dir ja mal als debug das, ausgeben lassen:


```
cout << content->substr(begin + search->size(), end - (begin + search->size()) << endl;
```

Und das:

```
cout << current << endl;
```


----------



## Lenkwaffe (4. November 2004)

aber ich glaube du hast mich falsch verstanden...ich brauche nicht die summen der einzelnen zahlen sondern nur die summe der einzelnen zeilen also in dem fall 23...


----------



## RedWing (4. November 2004)

Argh


```
#include <iostream>
#include <fstream>

using namespace std;

int main(){

        double sum = 0;
        char* line = new char[1024];
        string vergl;
        ifstream in("test.txt"); //Datei öffnen
        
        while(!in.eof()){
                in.getline(line, 1024);
                vergl = line;
                if(vergl.find("Ausgabe:") != string::npos)
                        sum++;
        }
        in.close();
        cout << sum << endl;

        return 1;
}
```


----------



## Lenkwaffe (4. November 2004)

ah...vielen vielen dank...jetzt ...


----------

