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...
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;
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 112354
Url: https://administrator.de/contentid/112354
Ausgedruckt am: 23.11.2024 um 05:11 Uhr
2 Kommentare
Neuester Kommentar
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;
}