Nur bestimmte Stellen auslesen?



  • 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 😃



  • so jetzt bin ichs nochmal,

    und zwar lese ich mit ner schleife meine werte ein und gib sie aus. das problem ist ja das jedesmal die datei neu angelegt wird und meine werte dann überschrieben werden.
    Wie kann ich denn des abfangen?


Anmelden zum Antworten