In die erste Zeile einer existierenden Datei schreiben ohne den Restinhalt zu löschen



  • Hallo,

    um mein Programm etwas schneller zu machen, wollte ich wissen wie man in eine existierende Datei am Anfang eine Zeile einfügen kann ohne den Rest der Datei zu überschreiben. Ist sowas möglich oder lohnt sich der durch Aufwand umkopieren nicht?

    Aktuell sieht mein Code wie folgt aus ohne das ich versuche an den Anfang der Datei zu schreiben: M ist eine sparse Matrix vom Typ boost::numeric::ublas::compressed_matrix

    [cpp]
    fstream f;
    f.open(file, ios::out);
    int number = M.nnz();
    double val;
    for(compressed_matrix<double>::const_iterator1 it = M.begin1(); it != M.end1(); ++it) {
            for(compressed_matrix<double>::const_iterator2 it2 = it.begin(); it2 != it.end(); ++it2) {
                val = M(it2.index1(),it2.index2());
    	    if (abs(val) > 1e-20) {
    		f<<it2.index1()+1<<"\t"<<it2.index2()+1<<"\t"<<val<<endl;
    	    } else {
    		number--;
    	    }
            }
    }
    [b]
    f<<M.size1()<<"\t"<<M.size2()<<"\t"<<number<<endl;[/b]
    [/cpp]
    

    Der fett markierten Code sollte in der ersten Zeile meiner Datei stehen und danach der Rest folgen. Die integer Zahl number kenne ich aber erst nachdem ich die Matrix durchgelaufen bin. Ich will die Matrix aber nicht zweimal durchlaufen, um einmal number zu bestimmen und danach auszugeben. Wie lässt sich das Problem lösen?

    Danke.



  • Du kannst die Datei ja einfach auslesen, in einem string speichern.
    Dann ne Zeile hinzufügen & das Ganze zurückspeichern,
    aber darauf bist du sicher gekommen 😃

    #include "stdafx.h"
    #include <string>
    #include <fstream>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        string filename = "datei.txt";
        string neuezeile;
        string zeile;
        string text;
        ifstream read;
        read.open(filename.c_str(), ios::in);
        while (!read.eof()){
            getline(read, neuezeile);
            text += neuezeile + "\n";
        }
        read.close();
        cout << "Neue Zeile: ";
        getline(cin, neuezeile);
        getchar();
        ofstream write;
        write.open(filename.c_str(), ios::out);
        write << neuezeile+"\n"+text;
        write.close();
        cout << "ok";
        getchar();
        return 0;
    }
    


  • @MasterG87
    Du kannst an Dateien immer nur hinten was anhängen. Vorne anhängen geht nicht. In der Mitte einfügen geht auch nicht.
    D.h. du musst den gesamten Inhalt der Datei umkopieren.


Anmelden zum Antworten