ubuntuusers.de

C++, Datei zeilenweise lesen (gcc)

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

FeistySpawn

Avatar von FeistySpawn

Anmeldungsdatum:
5. Oktober 2007

Beiträge: 107

Hallo,

ich habe eine kleine Klasse, welche eine Datei öffnet und mit der
Funktion GetNext, die nächste Zeile lesen soll.
Das klappt auch so weit, aber die Funktion liest immer einmal zu viel,
daher:
Eingabedatei(infile.dat):

zeile1
zeile2
zeile3


Programmausgabe:

-GetNext true
Count:1 zeile1
-GetNext true
Count:2 zeile2
-GetNext true
Count:3 zeile3
-GetNext true
Count:4 
-GetNext false


Und hier die Klasse:

#ifndef READFILEASLINE_H
#define READFILEASLINE_H

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class ReadFileAsLine
{
public:
    ReadFileAsLine(string fileName);
    virtual ~ReadFileAsLine();

	bool GetNext();
	bool FileEOF;
	string Buffer;

protected:
private:
    ifstream inputFile;
    string buffer;

};

#endif // READFILEASLINE_H
-----------------------------------------------
#include "readfileasline.h"

ReadFileAsLine::ReadFileAsLine(string fileName)
{
    //ctor
    FileEOF = false;
    try
    {
        inputFile.open(fileName.c_str(), ifstream::in);
    }
    catch (exception e)
    {
        cout << "error open file: " << fileName << endl;
    }
}

ReadFileAsLine::~ReadFileAsLine()
{
    //dtor
}

bool ReadFileAsLine::GetNext()
{
    if (!inputFile.eof())
    {
        getline(inputFile, buffer);
        Buffer = buffer;
        cout << "-GetNext true" << endl;
        return true;
    }
    else
    {
        FileEOF = true;
        cout << "-GetNext false" << endl;
        return false;
    }
}
-------------------------------------------------------
#include <iostream>
#include <fstream>
#include "./readfileasline.h"

using namespace std;

int main (int argc, char *argv[])
{
    ReadFileAsLine *rf = new ReadFileAsLine("./infile.dat");
    int c = 0;
    while (rf->GetNext())
    {
        c++;
        cout << "Count:" << c << " " << rf->Buffer << endl;
    }
    return 0;
} 

Was mache ich falsch?

Danke und Gruüße FS.

Harleen

Anmeldungsdatum:
12. Februar 2006

Beiträge: 183

Wohnort: Bremen

Du machst nichts falsch. EOF wird erst gesetzt, wenn einmal über das Dateiende hinweggelesen worden ist.

FeistySpawn

(Themenstarter)
Avatar von FeistySpawn

Anmeldungsdatum:
5. Oktober 2007

Beiträge: 107

Hallo Harleen,

ist zwar komisch, scheint aber wohl so zu sein.
Habe es nun wie folgt drin, und es geht.

bool ReadFileAsLine::GetNext()
{
    if (!inputFile.eof())
    {
        getline(inputFile, buffer);
        Buffer = buffer;

        if (inputFile.eof())
        {
            FileEOF = true;
            return false;
        }
        else
        {
            return true;
        }
    }
    else
    {
        FileEOF = true;
        return false;
    }
} 

Vielen Dank.

Gruesse FS.

Bauer

Anmeldungsdatum:
28. Juni 2006

Beiträge: 333

Das ist vielleicht interessant für dich.

FeistySpawn

(Themenstarter)
Avatar von FeistySpawn

Anmeldungsdatum:
5. Oktober 2007

Beiträge: 107

Hallo Bauer,

danke für deinen Tipp.

Gruesse FS.

Antworten |