Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung C und C++

Mitglied: Tiggalot

Tiggalot (Level 1) - Jetzt verbinden

25.03.2009, aktualisiert 15:46 Uhr, 7284 Aufrufe, 2 Kommentare

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

01.
#include <iostream> // für cin & cout 
02.
#include <fstream> // um Dateien zu einzulesen 
03.
#include <string> // für den Datentyp string 
04.
#include <stdlib.h> // weil ich es kann 
05.
#include <time.h> // um einen fortlaufenden Wert für das generieren einer Zufallszahl zu haben 
06.
using namespace std; 
07.
 
08.
int main () 
09.
10.
	//Variablendeklaration 
11.
	int i, zufall, cnt = 0; 
12.
	string foo; 
13.
	 
14.
	//Zufallszahlengenerator an Zeit gekoppelt initialisieren 
15.
	srand ( time(NULL) ); 
16.
	 
17.
	//Datei öffnen bzw. Fehler melden wenn dies nicht möglich ist 
18.
	ifstream datei; 
19.
	datei.open("excuses.txt", ios::in | ios::binary); 
20.
	if (!datei) 
21.
22.
		cerr << "Kann die Datei: excuses.txt nicht öffnen!" << endl; 
23.
		return 1; 
24.
25.
	 
26.
	// Anzahl der Zeilen ermitteln (alternativ zu foo könnte ich auch eine feste Größe angeben) 
27.
	while (getline(datei, foo)) 
28.
29.
		cnt ++; 
30.
31.
	 
32.
	//Zufallszahl zwischen 0 und Anzahl der Zeilen in Datei generieren 
33.
	zufall = rand() % cnt; 
34.
	 
35.
	// Array von der größe der Zeilenanzahl erstellen 
36.
	string puffer[cnt]; 
37.
	i = cnt; 
38.
	 
39.
	// An Anfang der Datei springen 
40.
	datei.seekg(ios_base::beg); 
41.
	 
42.
	//Zeilenweise Datei einlesen 
43.
	while (getline(datei, puffer[i])) 
44.
45.
		i--; 
46.
47.
	//Datei schließen 
48.
	datei.close(); 
49.
	 
50.
	//Ausgabe einer zufälligen Zeile 
51.
	cout << "Number of available excuses: " << i << endl; 
52.
	cout << "Excuse No. " << zufall << ": " << puffer[zufall] << endl; 
53.
	return 0; 
54.
}
Mitglied: Tiggalot
26.03.2009 um 11:28 Uhr
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.
Bitte warten ..
Mitglied: chfr77
01.05.2009 um 14:24 Uhr
Ich hab das auch mal gemacht, aber ohne doppeltes Auslesen.
01.
// ausrede.cpp 
02.
#include <string> 
03.
#include <iostream> 
04.
#include <fstream> 
05.
#include <vector> 
06.
#include <time.h> 
07.
int main(int argc, char* argv[]) 
08.
{	 
09.
srand(static_cast<unsigned>(time(0))); 
10.
char * szBuf = new char[0x1000]; 
11.
std::ifstream file_in(argv[1]);  
12.
std::vector<std::string> vec_zeilen; 
13.
while (file_in.getline(szBuf, 0x1000))  
14.
vec_zeilen.push_back(std::string(szBuf)); 
15.
std::cout << "Es geht nicht, weil: " <<  
16.
vec_zeilen.at(rand() % vec_zeilen.size()) << std::endl; 
17.
delete [] szBuf; 
18.
return 0; 
19.
}
Bitte warten ..
Ähnliche Inhalte
Java
gelöst Textdatei in Array speichern (zeilenweise) (1)

Frage von Bruchsal zum Thema Java ...

Batch & Shell
gelöst Batch: Textdatei Zeilenweise auslesen (2)

Frage von CreatorX zum Thema Batch & Shell ...

C und C++
String einlesen in Array und wieder ausgeben von hinten (4)

Frage von Protected zum Thema C und C ...

Batch & Shell
gelöst Bestimmte Zeile einer Textdatei mit Batch auslesen (2)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Neue Wissensbeiträge
Windows Update

Microsoft Update KB4034664 verursacht Probleme mit Multimonitor-Systemen

(2)

Tipp von beidermachtvongreyscull zum Thema Windows Update ...

Viren und Trojaner

CNC-Fräsen von MECANUMERIC werden (ggf.) mit Viren, Trojanern, Würmern ausgeliefert

(4)

Erfahrungsbericht von anteNope zum Thema Viren und Trojaner ...

Windows 10

Windows 10: Erste Anmeldung Animation deaktivieren

(3)

Anleitung von alemanne21 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Netzwerkprotokolle
gelöst Leiten "dumme" Switches VLAN-Tags mit durch? (26)

Frage von coltseavers zum Thema Netzwerkprotokolle ...

Netzwerkgrundlagen
Kann auf Freigabe nicht Zugreifen (17)

Frage von leon123 zum Thema Netzwerkgrundlagen ...

Windows Server
gelöst Neues KB für W10 1607 und W2K16 wieder mal nicht im WSUS 3.0, hat das noch jemand? (16)

Frage von departure69 zum Thema Windows Server ...

Windows Server
DC virtualisieren + wie sichern (SingleDC-Environment) (12)

Frage von KMUlife zum Thema Windows Server ...