PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arbeiten mit Dateien in C++



smog_at
17-09-2003, 18:46
Hey @all,

Hier zuerst mal der Code:


#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[]) {
int lines=0;
ifstream File(DATEINAME);

if(File) {
while(!File.eof()) {
_char='\0';
File.get(_char);
if(_char=='\n')
lines++;
}

File.seekg(0, ios_base::beg);
_char='\0';

while(!File.eof()) {
while(_char!='\n') {
File.get(_char);
if(_char==':')
cout << endl;
else
cout << _char;
}
}
}
return 0;
}

So, nun mein Problem ist, daß das Programm mit dem Befehl


File.seekg(0, ios_base::beg);

die Datei nicht an den Anfang zurücksetzt, weshalb die nachstehenden Befehl nicht mehr ausgeführt werden, kann man mit C++ den nicht in der Datei umher wandern, wenn das Dateiende erreicht wurde? Oder liegt das Problem woanders?

Kann mir das bitte jemand helfen?

Mfg Flex

P.S.: die Zeilen(die in die Variable "lines" gespeichert wird) brauche ich, um später meinen Vector(STL) zu initialisieren!

wraith
17-09-2003, 19:12
Du mußt die Flags deines Fileobjekts löschen (mit clear).
Hmm,das du zeichenweise einliest ist sehr inperformant,wenn du die Zeilen in einem vector brauchst,dann mach es so


#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iterator>
using namespace std;

int main()
{
ifstream file("dat.txt");
string line;
vector<string> vec;

while(getline(file,line))
vec.push_back(line);

copy(vec.begin(),vec.end(),ostream_iterator<string>(cout,"\n"));
}


Btw. ios_base:: ist auch nicht korrekt,es heißt einfach ios::,wenn dein Compiler das nicht kann hol' dir einen aktuellen,
Und eine Variable _char zu nennen ist sehr unglücklich,alle Bezeichner,die mit _ beginnen sind für die Implementierung reserviert.

smog_at
17-09-2003, 19:22
Ich brauche nicht die ganzen zeilen, nur die Inhalte zwischen den Doppelpunkten
(Will meine /etc/passwd auslesen)

Dateiaufbau:
Benutzer:Passwort:BenuterID:GruppenID:Echter Name:Heimatverzeichnis:Shell
.
.
.
Benutzer:Passwort:BenuterID:GruppenID:Echter Name:Heimatverzeichnis:Shell

Mit dem Zeichenweise lesen, wollte ich bezwecken, das er nur bis zum Doppelpunkt liest, und den Wert in den Vector schreibt, anschliessend mit dem nächsten Wert, usw.

MfG Flex

anda_skoa
17-09-2003, 20:30
Original geschrieben von smog_at
Mit dem Zeichenweise lesen, wollte ich bezwecken, das er nur bis zum Doppelpunkt liest, und den Wert in den Vector schreibt, anschliessend mit dem nächsten Wert, usw.


Es ist trotzdem sinnvoller, du liest Zeile für Zeile und zerlegst jede Zeile direkt nach dem Lesen, also dort wo in wraiths Beispiel das push_back ist.

Ciao,
_

smog_at
17-09-2003, 22:46
Ok, ich habe jetzt das Beispiel von "wraith" genommen:

Es ist trotzdem sinnvoller, du liest Zeile für Zeile und zerlegst jede Zeile direkt nach dem Lesen,
also dort wo in wraiths Beispiel das push_back ist.

Jedoch kenne ich mich mit dem zerlegen von Strings (deshalb die umständliche Tour mit Zeichenweisem einlesen)
nicht so ganz aus:(
Könnte mir da jemand helfen, wo ich ansetzen soll, wenn es geht, dann anhand von dem Beispiel von wraith.

MfG Flex

anda_skoa
18-09-2003, 10:00
Sieh dir dazu mal die Beschreibung der Methoden find() und substr() an:
http://www.cppreference.com/cppstring.html

Ciao,
_

smog_at
18-09-2003, 12:45
ok, bin schon fast fertig, jedoch kommen noch kleine Fehler, hier mal der Code:


#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char*argv[]) {
string line, str;
vector <string> vectorstring;
vector <string> vs;
int pos=0, i=0, j=0;

ifstream File("/etc/passwd");
if(File) {
// Einlesen des Strings in einen Vektor
while(getline(File, line))
vectorstring.push_back(line);
File.close();
}

// Zerlegen des Strings vom Vektor, und die Einzelteile in einen anderen Vektor ablegen
while(j!=vectorstring.size()) {
i=0;
while(pos!=vectorstring[j].length()) {
if(i==7)
break;
if(i<=5)
pos = vectorstring[j].find(":");

else if(i>5)
pos = vectorstring[j].length();
str = vectorstring[j].substr(0,pos);
vs.push_back(str);
vectorstring[j].erase(0,pos+1);
i++;
}
}
}


Nun, mein Problem ist, das einige Zeilen komplett sind, und dann sind immer welche dabei die den letzten Eintrag(also Shell) nicht mehr schreiben, beim einlesen jedoch funktioniert das.

Kann mir bitte jemand helfen?

MfG Flex