Seite 1 von 1

Datei auslesen

Verfasst: So Mai 20, 2012 10:04 pm
von Kmitska
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...

Re: Datei auslesen

Verfasst: Mo Mai 21, 2012 1:41 pm
von Xin
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.

Re: Datei auslesen

Verfasst: Mo Mai 21, 2012 4:17 pm
von Kerli
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();

Re: Datei auslesen

Verfasst: Di Mai 22, 2012 8:46 pm
von Kmitska
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?

Re: Datei auslesen

Verfasst: Di Mai 22, 2012 9:07 pm
von cloidnerux
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.

Re: Datei auslesen

Verfasst: Di Mai 22, 2012 9:32 pm
von Xin
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...)

Re: Datei auslesen

Verfasst: Do Mai 24, 2012 9:28 pm
von Kmitska
Als was würdet ihr das speichern? Char oder String?

Re: Datei auslesen

Verfasst: Do Mai 24, 2012 9:38 pm
von cloidnerux
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...)