Nur bestimmte Stellen auslesen?



  • Wozu mehrmals einlesen? Merk dir den Wert einmal im Programm und verwende ihn dann so oft wie du ihn brauchst.

    (ansonsten mußt du vor einem neuen Einlesen auch wieder an die richtige Position seek()en - nach dem obigen read()-Beispiel steht der Lesezeiger der Datei auf Position 8 )

    Edit: Und ja, wenn du ständig durch die Datei durchackern willst, ist es womöglich günstiger, sie einmal einzulesen und dann im Speicher zu halten.



  • ok, ich schreib den eingelesenen Wert in ne Variable. Wenn ich aber dann von 15-21 einlesen will dann funktionierts net.
    Muss ich da den kompletten vierzeilen nochmal nehmen?



  • Was muss ich dann den machen wenn ich Datei einmal lokal abspeichern will und dann aus ihr auszulesen?

    Vielen Dank

    Viele Grüße



  • Nimm dir einen vector (oder einen anderen Container der STL) und kopier die Datei komplett dort rein (byteweise auslesen und per push_back() einfügen).



  • Kannst Du mir vielleicht sagen was an folgendem Code falsch ist:

    fstream file(datei,ios::in);
    char sender[7], dat[7];
    file.seekg(9);//Ziel ansteuern
    file.read(sender,6);//Daten auslesen
    sender[6]='\0';
    cout<<sender<<endl<<endl;
    file.seekg(25);//Ziel ansteuern
    file.read(dat,6);//Daten auslesen
    dat[6]='\0';
    cout<<dat;

    Ich bekomm bei der Ausgabe nur sender angezeigt. Dat wird mir nicht ausgegeben. An was kann das denn liegen?



  • a) ist die Datei lang genug?
    b) womöglich steht dat noch im Ausgabepuffer - cout schreibt erst auf den Bildschirm, wenn der Puffer voll ist (oder du ihn entleerst, z.B. mit "cout<<endl;").



  • Ja die Datei wäre lang genung. Sie hat 274 Zeichen und mit endl oder .flush() funktioniert es auch nicht. Was kann ich denn da noch machen?



  • flip schrieb:

    Was kann ich denn da noch machen?

    Breakpoint setzen und den Debugger fragen, was in den verwendeten Variablen landet.



  • Oh mann ich blicks echt nicht mehr,

    du kann ich die seek funktion auch benutzen wenn ich mir den ganzen Dateiinhalt in ein array reinschreibe?
    Wie lautet denn dann der Code?

    Vielen Dank



  • vector<char> filedata;
    ifstream file("daten.txt",ios::in|ios::binary);
    char ch;
    while(file.get(ch))
      filedata.push_back(ch);
    

    Das liest den kompletten Dateiinhalt in den vector (dynamisches Array) 'filedata' - anschließend kannst du dort beliebig vor und zurück laufen und mit den einzelnen Elementen arbeiten

    Um einen Teilbereich zu betrachten, kannst du entweder direkt Pointer in die Daten verwenden oder den Bereich rauskopieren:

    char data[7]={0};
    copy(filedata.begin()+9,filedata.begin()+15,data);
    


  • Ok, cool, vielen Dank.
    Sind dann eigentlich die Leerstellen weg wenn ich das so einlese? Das wäre nämlich cool



  • Nein, mit dem obigen Code steht genau das selbe im Vektor, was vorher in deiner Datei stand - inklusive aller Leerzeichen und Steuerzeichen. Je nach Dateistruktur könntest du die Daten auch strukturiert auslesen und zwischenlagern:

    struct person
    {
      string name,vorname;
      double gehalt;
      bool geschlecht;
      ...
    };
    
    vector<person> Liste;
    ifstream file("liste.txt");
    while(file)
    {
      person p;char g;
      file>>p.name>>p.vorname>>p.gehalt>>g;
      p.geschlecht=(g=='m'||g=='M');
      ...
      //edit: Das hatte ich wohl unterschlagen:
      Liste.push_back(p);
    }
    

    (wie das bei dir aussehen muß, hängt vom tatsächlichen Aufbau der Datei ab, die du einlesen willst)



  • guten morgen,

    kannst du mir nochmal weiterhelfen und zwar müsste ich jetzt die arrays in die ich die werte geschriegen habe in eine txt datei schreiben.

    Geht das?
    kannst du mir hier bitte auch nochmal den code sagen?

    vielen dank



  • Ja, klar geht das (jetzt am Beispiel der obigen struct person demonstriert):

    ofstream fout("out_liste.dat");
    for(int i=0;i<Liste.size();++i)
      fout<<Liste[i].name<<' '<<Liste[i].vorname<<' '<<Liste[i].gehalt<<' '<<(Liste[i].geschlecht)?'M':'W'<<...<<endl;
    

    (achte vor allem auf die Trennzeichen zwischen den einzelnen Elementen, sonst kannst du sie später nicht mehr auseinandernehmen.

    Die etwas komplexere Lösung wäre es, den Ausgabe-Operator zu überladen:

    ostream& operator<<(ostream& out, const person& p)
    {
      out<<p.name<<' '<<p.vorname<<' '<<...;
      return out;
    }
    
    ...
    for(int i=0;i<Liste.size();++i)
      fout<<Liste[i]<<endl;
    


  • Ok,

    vielen Dank schon mal.
    Aber ich les es doch so:

    char datum[7];
    file.seekg(115);//Ziel ansteuern
    file.read(datum,6);//Daten auslesen
    datum[6]='\0';

    ein. Wie kann ich denn da das Datum in ne Datei schreiben?



  • Ah ja, dann mußt du das genau umgekehrt machen - seekp() setzt den Schreibzeiger der Datei (wenn erforderlich), write() schreibt die Daten.



  • Sorry das ich schon wieder nerv,

    aber könntest Du mir bitte ein konretes Beispiel geben.
    Ich blicks heut noch nicht. War gestern auf dem Fasching. Sorry



  • Na gut, weil du's bist:

    char data[7];
    ...//data mit Werten füllen
    file.seekp(115);   //Ziel ansteuern
    file.write(data,6);//Daten schreiben
    


  • Super, vielen Dank
    Bist ne Wucht!



  • Irgendwie muß ich ja beweisen, daß ich meinen Posten zu Recht bekommen habe 😃


Anmelden zum Antworten