Datei auslesen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Datei auslesen

Beitrag von Kmitska » So Mai 20, 2012 10:04 pm

Moin moin,

versuche hier in diesem Beispiel eine Text-Datei zu lesen.

Code: Alles auswählen

string fim::getContent()
{
    string line, content;

    ifstream file( fileName );

    if(file.good())
    {
       [b] //Bis hier funktioniert es[/b]

        file.seekg(0L, ios::beg);
        while(!file.eof())
        {
            getline( file , line );
            content += line;
        }
        return content;
    }
}

Code: Alles auswählen

class fim
{
    private:
        char fileName[100];
    public:
        fim(char file[]);

        bool fileExists( void );
        bool createFile ( void );
        bool addInfo( string var, string val );

        string getContent( void );
};
Aber leider wird sie nicht gelesen...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datei auslesen

Beitrag von Xin » Mo Mai 21, 2012 1:41 pm

Ich gebe zu, dass mir das Gehampel mit den C++-Klassen meist zu aufwendig ist.
Darum nehme ich meistens dann doch eigene Funktionen, die C-Funktionalität verwenden.

Zumal mir in Deinem Code nicht klar wird, was Du da eigentlich lesen willst?!
Einen Text, denn Du in einem std::string speicherst, denn Du laufend mit einem größeren String überschreibst?

Finde die Größe (siehe fseek oder ftell) raus, alloziere den Speicherblock und zieh Dir den kompletten Text mit fread() rein. Feddisch.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Datei auslesen

Beitrag von Kerli » Mo Mai 21, 2012 4:17 pm

Geht auch mit streams einfach:

Code: Alles auswählen

// Stream öffnen (Lesezeiger am Ende (std::ios::ate)
std::ifstream file(file_name, std::ios::in | std::ios::binary | std::ios::ate);
if( !file )
{
  std::cerr << "Failed to open file '" << file_name << "'" << std::endl;
  return -1;
}

// Lesezeigerposition == Dateigröße
size_t size = file.tellg();
std::vector<char> data(size);

// Lesezeiger zurück an den Anfang
file.seekg(0, std::ios::beg);

// Alles lesen
file.read(&data.front(), size);

// Und Datei zu (Kann man weglassen, da automatisch vom Destruktor erledigt)
file.close();
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Datei auslesen

Beitrag von Kmitska » Di Mai 22, 2012 8:46 pm

Wie ist eigentlich meine Art, sie funktionert ja eigentlich auch, nur hier nicht...

Also was ich da mache ist dies:
Die einzelne Linien lesen und bei dem Gesamtstring einfügen.

Was würdet ihr mir in diesem Fall empfehlen?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Datei auslesen

Beitrag von cloidnerux » Di Mai 22, 2012 9:07 pm

Wie ist eigentlich meine Art, sie funktionert ja eigentlich auch, nur hier nicht...

Also was ich da mache ist dies:
Die einzelne Linien lesen und bei dem Gesamtstring einfügen.

Was würdet ihr mir in diesem Fall empfehlen?
Es gibt auch hier keine Non-Plus-Ultra. Einzelne Linien zu lesen Funktioniert auch, ist aber egt nicht sinnvoll, da du jedes mal das OS immer nur anweist, einen kleinen Teil zu lesen und dann jedes mal darauf warten musst, dass die Festplatte wieder zur nächsten Stelle springt, da ist es besser, größere Blöcke zu lesen.
Vorallem weil du ja durch die "\n" sowieso einen Zeilenumbruch mit liest.
Also, ich würde Probieren einfach alles zu lesen und dann die strings zu Zerhackstückeln, oder auch nicht, je nach dem was gefordert ist.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datei auslesen

Beitrag von Xin » Di Mai 22, 2012 9:32 pm

Abgesehen davon, dass ich Textlines sich nicht direkt mit Textlinien übersetzen lässt, stimme ich cloidnerux zu, wenn die Dateien klein genug sind (wobei "klein" bei heutigen Speichergrößen relativ groß ist...)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Datei auslesen

Beitrag von Kmitska » Do Mai 24, 2012 9:28 pm

Als was würdet ihr das speichern? Char oder String?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Datei auslesen

Beitrag von cloidnerux » Do Mai 24, 2012 9:38 pm

Als was würdet ihr das speichern? Char oder String?
Setzt dich mal hin und denk mal drüber nach, was ein Char und ein string ist.
Dann beantwortet sich deinen Frage von alleine.

(Überlege dir mal, wie du eine string-Klasse implementieren würdest, wenn dir die frage kommt was mit char* ist...)
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten