tiggalot
Goto Top

CPP Problem - Textdatei zeilenweise einlesen und zufällige Zeile ausgeben

Hallo zusammen.

Ich bin gerad dabei mich in C++ einzuarbeiten und habe nun als kleine Übung vor eine Textdatei zeilenweise einzulesen und eine zufällige Zeile auszugeben.

Meine momentane vorgehensweise ist folgende:
1. Datei öffnen
2. Schleife laufen lassen um die Anzahl der Zeilen zu ermitteln
3. An den Anfang der Datei zurückspringen
4. Ein String Array anlegen dessen Dimension die Anzahl der Zeilen ist
5. Eine Zufallszahl generieren
6. Eine zweite Schleife laufen lassen und den Zeileninhalt in mein Array einlesen
7. Den Inhalt der Zeile mit der Nummer der Zufallszahl ausgeben.

Das ermitteln der Zeilenanzahl klapp, das generieren einer Zufallszahl klappt, aber was nicht klappt ist das zurückspringen an den Anfang der Datei. Ich hab auch schonmal probehalber tellg eingebaut gehabt um herauszufinden ob er überhaupt springt, aber das einzige das ich zurückbekommen habe war der Wert -1, welcher nur sagt das es einen Fehler gab...

#include <iostream> {{comment_single_line_double_slash:0}}
#include <fstream> {{comment_single_line_double_slash:1}}
#include <string> {{comment_single_line_double_slash:2}}
#include <stdlib.h> {{comment_single_line_double_slash:3}}
#include <time.h> {{comment_single_line_double_slash:4}}
using namespace std;

int main ()
{
	//Variablendeklaration
	int i, zufall, cnt = 0;
	string foo;
	
	//Zufallszahlengenerator an Zeit gekoppelt initialisieren
	srand ( time(NULL) );
	
	//Datei öffnen bzw. Fehler melden wenn dies nicht möglich ist
	ifstream datei;
	datei.open("excuses.txt", ios::in | ios::binary);  
	if (!datei)
	{
		cerr << "Kann die Datei: excuses.txt nicht öffnen!" << endl;  
		return 1;
	}
	
	// Anzahl der Zeilen ermitteln (alternativ zu foo könnte ich auch eine feste Größe angeben)
	while (getline(datei, foo))
	{
		cnt ++;
	}
	
	//Zufallszahl zwischen 0 und Anzahl der Zeilen in Datei generieren
	zufall = rand() % cnt;
	
	// Array von der größe der Zeilenanzahl erstellen
	string puffer[cnt];
	i = cnt;
	
	// An Anfang der Datei springen
	datei.seekg(ios_base::beg);
	
	//Zeilenweise Datei einlesen
	while (getline(datei, puffer[i]))
	{
		i--;
	}
	//Datei schließen
	datei.close();
	
	//Ausgabe einer zufälligen Zeile
	cout << "Number of available excuses: " << i << endl;  
	cout << "Excuse No. " << zufall << ": " << puffer[zufall] << endl;  
	return 0;
}

Content-ID: 112354

Url: https://administrator.de/contentid/112354

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

Tiggalot
Tiggalot 26.03.2009 um 11:28:20 Uhr
Goto Top
Habe das Problem nun umgangen indem ich das Zeilen zählen und das einlesen in separate Funktionen ausgegliedert habe.

Aber fall jemandem noch was zum Thema einfällt wäre ich trotzdem dankbar.
chfr77
chfr77 01.05.2009 um 14:24:34 Uhr
Goto Top
Ich hab das auch mal gemacht, aber ohne doppeltes Auslesen.
// ausrede.cpp
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <time.h>
int main(int argc, char* argv)
{	
srand(static_cast<unsigned>(time(0)));
char * szBuf = new char[0x1000];
std::ifstream file_in(argv[1]); 
std::vector<std::string> vec_zeilen;
while (file_in.getline(szBuf, 0x1000)) 
vec_zeilen.push_back(std::string(szBuf));
std::cout << "Es geht nicht, weil: " <<   
vec_zeilen.at(rand() % vec_zeilen.size()) << std::endl;
delete  szBuf;
return 0;
}