Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

18.08.2005, 20:04

C++: beliebige Zeile aus Datenbank auslesen [gelöst]

Ich will aus einer Textdatei die ich mit c++ öffne eine beliebige Zeile lesen. z.B. Zeile 20
Die Textdateidatei wird so geöffnet:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
     fstream datei;
     int a, b;
     datei.open("test.txt", ios::in);
}


bye Benny
Intel Pentium 3,6GHz
1,00GB DDR Ram
GeForce FG 6800LE
Asus P5P800 Mainboard

_______________________


Mein Bäckerforum: http://www.baeckerforen.de
Mein OS Forum: http://www.free-your-os.com

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »??Linux« (18.08.2005, 20:04)


2

18.08.2005, 20:13

ich glaub du öffnest mit nano oder?

dann mach erst strg.+w und dann strg+t und da gibts dann die linie an

ich hoffe du meinst das
I bin der Chef \o/

3

18.08.2005, 20:17

Zitat

Original von Deluca
ich glaub du öffnest mit nano oder?

dann mach erst strg.+w und dann strg+t und da gibts dann die linie an

ich hoffe du meinst das


Nö, ich öffne diese Testdatei mit c++.

bye Benny
Intel Pentium 3,6GHz
1,00GB DDR Ram
GeForce FG 6800LE
Asus P5P800 Mainboard

_______________________


Mein Bäckerforum: http://www.baeckerforen.de
Mein OS Forum: http://www.free-your-os.com

4

18.08.2005, 23:31

Da wirst du wohl nich drumrum kommen jede Zeile mitzuzählen...

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
        fstream datei;
        int a, b;
        datei.open("test.txt", ios::in);
        int actual_row = 1;
        string row_content = "";
        while(!datei.eof() &&actual_row <= 20){
                datei >> row_content;
                actual_row++;
        }
        cout << row_content << endl;
        datei.close();
}


Oder dir ist die Anzahl der Zeichen pro Zeile bekannt, da kann man dann sicherlich auch was mit

Quellcode

1
istream&  fstream::seekg(streampos pos );


machen.

Gruß

RedWing

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »RedWing« (18.08.2005, 23:32)


5

30.08.2005, 22:49

Zitat

Original von RedWing
Da wirst du wohl nich drumrum kommen jede Zeile mitzuzählen...

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
        fstream datei;
        int a, b;
        datei.open("test.txt", ios::in);
        int actual_row = 1;
        string row_content = "";
        while(!datei.eof() &&actual_row <= 20){
                datei >> row_content;
                actual_row++;
        }
        cout << row_content << endl;
        datei.close();
}


Oder dir ist die Anzahl der Zeichen pro Zeile bekannt, da kann man dann sicherlich auch was mit

Quellcode

1
istream&  fstream::seekg(streampos pos );



Danke für diesen Code, er funktioniert super.
Die Anzahl der Zeichen pro Zeile sind mir nicht bekannt, da jede Zeile eine unterschiedliche Anzahl an Zeichen hat.

bye Benny
Intel Pentium 3,6GHz
1,00GB DDR Ram
GeForce FG 6800LE
Asus P5P800 Mainboard

_______________________


Mein Bäckerforum: http://www.baeckerforen.de
Mein OS Forum: http://www.free-your-os.com

6

07.09.2005, 20:01

@RedWing

Kennst du vielleicht auch ne Möglichkeit um die Zeilen rauf zu gehen?
z.B.: ich bin gerade in der Zeile 20 und muss in die Zeile 12...
Ich hoff ihr versteht, was ich gerade meine.

bye Benny
Intel Pentium 3,6GHz
1,00GB DDR Ram
GeForce FG 6800LE
Asus P5P800 Mainboard

_______________________


Mein Bäckerforum: http://www.baeckerforen.de
Mein OS Forum: http://www.free-your-os.com

7

07.09.2005, 20:55

Hallo,
ich würde das event. so machen indem du dir die Position merkst wenn du an Zeile 12 bist...
Ein zurücklaufen ist mir so nicht bekannt, da meiner Meinung nach ein File immer nur sequentiell von vorn
nach hinten durchlaufen werden kann.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
        fstream datei("test.txt", ios::in);
        int actual_row = 1;
        string row_content = "";
        int pos = 0;
        while(datei && actual_row <= 20){
                if(actual_row == 12)
                        pos = datei.tellg();
                datei >> row_content;
                actual_row++;

        }
        cout << row_content << endl;
        if(!datei) //if error bit is set (for e.g. file is at the end) set goodbit again
                datei.clear();
        datei.seekg(pos); //positionizing file pointer to line 12
        datei >> row_content; //read out line 12
        cout << row_content << endl;
        datei.close();
}


Ansonsten schau auch mal in der API Referenz:

http://www.cplusplus.com/ref/iostream/fstream/

//edit: Mein obiges Bsp war schlecht das mit dem überprüfen mit Hile von eof() da es auch mal
passieren kann das über das Ende der Datei gelesen wird und somit is die obige Methode ungültig.
Diese hier is da besser :)
Gruß

RedWing

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »RedWing« (07.09.2005, 20:58)


8

08.09.2005, 13:37

Ich habs jetzt gelöst, ich geh dann wieder zum Dateianfang und lass dann den Code von RedWing durchlaufen...

Ich mach das so:

Quellcode

1
2
3
4
5
6
7
....
datei.seekg(0, ios::beg); /* mit ios::beg geh ich an den Dateianfang und mit
                                             0 sag ich ihm das er vom
                                             nullten (also ersten) Zeichen
                                             lesen soll, danach lass ich den Code von RedWing
                                             durchlaufen und dann bin ich in der gewünschten
                                             Zeile... */


bye Benny
Intel Pentium 3,6GHz
1,00GB DDR Ram
GeForce FG 6800LE
Asus P5P800 Mainboard

_______________________


Mein Bäckerforum: http://www.baeckerforen.de
Mein OS Forum: http://www.free-your-os.com

9

09.09.2005, 13:55

Zitat

Original von ??Linux
Ich habs jetzt gelöst, ich geh dann wieder zum Dateianfang und lass dann den Code von RedWing durchlaufen...

Ich mach das so:

Quellcode

1
2
3
4
5
6
7
....
datei.seekg(0, ios::beg); /* mit ios::beg geh ich an den Dateianfang und mit
                                             0 sag ich ihm das er vom
                                             nullten (also ersten) Zeichen
                                             lesen soll, danach lass ich den Code von RedWing
                                             durchlaufen und dann bin ich in der gewünschten
                                             Zeile... */


bye Benny


Wieso machst dus nicht so wie ich oben und merkst dir beim ersten Durchlauf die Position der 12ten
Zeile?
Dann brauchst du das File nur einmal durchzulaufen...

Gruß

RedWing

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »RedWing« (09.09.2005, 13:55)


10

09.09.2005, 14:10

Zitat

Original von RedWing

Zitat

Original von ??Linux
Ich habs jetzt gelöst, ich geh dann wieder zum Dateianfang und lass dann den Code von RedWing durchlaufen...

Ich mach das so:

Quellcode

1
2
3
4
5
6
7
....
datei.seekg(0, ios::beg); /* mit ios::beg geh ich an den Dateianfang und mit
                                             0 sag ich ihm das er vom
                                             nullten (also ersten) Zeichen
                                             lesen soll, danach lass ich den Code von RedWing
                                             durchlaufen und dann bin ich in der gewünschten
                                             Zeile... */


bye Benny


Wieso machst dus nicht so wie ich oben und merkst dir beim ersten Durchlauf die Position der 12ten
Zeile?
Dann brauchst du das File nur einmal durchzulaufen...


Weil ich mal die Zeile brauch, dann die und dann die, je nachdem...

bye Benny
Intel Pentium 3,6GHz
1,00GB DDR Ram
GeForce FG 6800LE
Asus P5P800 Mainboard

_______________________


Mein Bäckerforum: http://www.baeckerforen.de
Mein OS Forum: http://www.free-your-os.com

11

10.09.2005, 17:38

Je nach Dateigröße kannst du ja eine Liste erzeugen, die für jede durchlaufene Zeilennr. den Zeichenindex speichert. Bei großen Dateien reicht ja jede n-te Zeile und es wird (auch bei unvollständigen Daten) einfach von der nächstkleineren Zeile in der Liste die Datei durchlaufen, denn eine Liste ist schneller abgearbeitet als jedesmal die ganze Datei.
Wer möchte, kann stattdessen natürlich auch einen hinreichend komplizierten Suchbaum benutzen.