Zeichen von einer Datei in die andere!!



  • Das stimmt absolut nicht. Das in verhindert das löschen der Datei. Probier mal folgendes Beispiel (erstelle dir die 2 Textdateien einfach selbst und schreibe in Text2 eirgendwas rein). Mache es so, du schreibst 5 Zeilen in Text2 und in die 10. Zeile von Text1 schribst du auch etwas. Dann führst du folgendes Beispiel aus:

    ofstream ausgabedatei ("Test1.txt", ios_base::out | ios_base::in); // in verhindert löschen und app hängt ausgabe an Datei, out bedeutet Schreiben 
      ifstream eingabedatei ("Test2.txt", ios_base::in); //löschen und modifierung verhindern 
      char zeile[101]; // wenn du 100 Zeichen ausliest, dann sollte hier 1 mehr drin sein für die binäre \0. 
      char datum[11]; // hier gilt das selbe. 10 einlesen, also 1 mehr. 
    
      eingabedatei.getline(zeile,100); 
      while (!eingabedatei.eof())  
      {  
        for (int i=3; i < 13; i++) 
        {  
          datum[i-3] = zeile[i];  
        }  
    
        ausgabedatei << datum << endl;  
        eingabedatei.getline(zeile,100);  
      }
    

    Wenn du das gemacht hast, dann nimmst du die Geschichte mit dem in raus! Dann siehst du das die Datei bevor reingeschrieben wird gelöscht wird und genau das ist das was das in verhindern soll! Die Datei soll ja nicht gelöscht werden! Und das das löschen verhindert wird stht so richtig(!) im Buch und das ist auch der Grund warum ich es immer reinpacke um das löschen 100% zu vermeiden. Wenn ich was überschreibe ist das immer noch etwas anderes, als wenn komplett überschrieben wird. Dazu kommt noch, das in dafür sorgt das die Datei bereits vorhanden sein muss und nicht durch out erstellt wird! Das nicht löschen hat zudem den Vorteil, dass wenn ich z.B. einen bestimmten Bereich nur Überschreiben möchte, aber das was in einer Zeile weiter unten/oben steht nicht löschen möchte, sondern nur diesen Teil verändern möchte.

    Dazu ist mir aufgefallen das die Schleife da oben doch nicht funktioniert. Es werden nur 3 Buchstaben ausgegeben bei mir, der rest ist Leer (also was davor kommt).

    Code-Hacker



  • du arbeitest mit einem ofstream (mit o).
    1. du brauchst ios::out nicht extra mit angeben
    2. wenn du ios::in verwendest, ist der dateizeiger trotzdem am anfang der datei;
    die datei wird zwar nicht ersetzt, sondern überschrieben.
    wenn du am ende anhänfen willst,
    3. verwende ios::in|ios::ate oder sofort ios::app. aber nicht nur ios::in.
    außerdem lässt sich die schleife in

    while(file.getline(buf,100))
    

    umändern.
    edit: ich les mir noch lieber den beitrag vom OP durch 🙄
    ok. ich mach dir folgenden Vorschlag:

    #include <fstream>
    #include <string>
    using namespace std;
    
    void daten_lesen (const char *quelle, const char *ziel) //wenn du const char * verwendest
    //bist du auf der sichereren seite
      ifstream fin (quelle);
      ofstream fout (ziel); //wenn du nur anhängen willst: ofstream fout(ziel, ios::app);
      string s;
      while(getline(fin,s)) {
        fout << s.substr(3,10) << '\n';
      }
    }
    

    Wenn dir was unklar ist, dann frag



  • Das der Anfang überschrieben wird ist mir auch bewusst, deswegen ja auch mein Beispiel. Natürlich geht das auch mit ate bzw. app, je nachdem wo man es hinhaben will. Aber ganz gut um zu verhindern das eine neue Datei angelegt wird kann es schon sein. Es kommt halt immer auf den Verwendungszweck an.

    Code-Hacker



  • dann hab ich wohl ungenau gelesen. hab im moment viel stress um die ohren



  • Also nochmal:

    ofstream ausgabedatei (ziel, ios_base::out | ios_base::in | ios_base::app); // in verhindert löschen und app hängt ausgabe an Datei, out bedeutet Schreiben
    

    ofstream öffnet zum Schreiben, überschreibt evtl. die vorhandene Datei.
    Das ::out ist überflüssig, ist nämlich schon drin.
    Will man die Datei nicht überschreiben nimmt man ios::app. Dann werden die Daten angehängt. Das das gewollt ist, war hier im übrigen nie die Rede und wenn dass das Problem des Originalposters war, hätte er's wohl erwähnt.
    Das ::in hat in einem reinem Output-Stream nichts zu suchen. Sagt einem doch der Verstand 😕

    ifstream eingabedatei (quelle, ios_base::in); //löschen und modifierung verhindern
    

    Das ::in ist überflüssig. ifstream öffnet per default bereits nur zum lesen. Da wird schon nix gelöscht oder modifiziert.



  • Hab hier jetzt nochmal genauer gelesen und meine zu verstanden zu haben, dass es dir mit dem ::in beim ofstream darum ging, die Datei nicht zu löschen, sondern nur vom Anfang zu überschreiben. Keine Ahnung wie du darauf kommst, dass das hier gewollt war.

    Und selbst wenn man das will - ::in ist zum Lesen, Der Parameter wäre also völlig zweckentfremdet.
    Will man das löschen vermeiden, darf man halt kein trunc mit angeben. Einfach ofstream(.., ios_base::out). Fertig.



  • Moin beisammen 🙂

    freut mich, dass ihr so zahlreich antwortet !!

    Um mal klar zu stellen. Es soll bei jedem aufruf des Programms die Ziel-Datei komplett geleert werden. Aber mein Problem bestand auch nicht darin, sondern dass ich neben dem eigentlich eingelesenen auch datenmüll in meiner Ziel-Datei habe. Ich werden die Vorschläge von euch heute mal durchgehen und mich heute abend nochmal melden, ob es geklappt hat.

    Nochmals vielen Dank für die Zahlreichen Antworten 😉



  • Hallo nochmal....

    Ich hab jetzt folgenden code (von davie) ausprobiert.
    [cpp]
    #include <fstream>
    #include <string>
    using namespace std;

    void daten_lesen (const char *quelle, const char *ziel) //wenn du const char * verwendest
    //bist du auf der sichereren seite
    ifstream fin (quelle);
    ofstream fout (ziel); //wenn du nur anhängen willst: ofstream fout(ziel, ios::app);
    string s;
    while(getline(fin,s)) {
    fout << s.substr(3,10) << endl;
    }
    }
    [/cpp]

    jedoch musste ich am ende "endl" anstatt "\n" nutzen, damit er alles sauber reinschreibt.

    wenn ich nun aber das ganze mit strings einlese, habe ich das problem, einige eingelesenen daten in int umzuwandeln.

    Ist eine Typumwandlung von "string" in "int" möglich??

    Im grunde brauche ich die "int" werte um zwei Uhrzeiten, die ich aus der Textdatei lese voneinander zu subtrahieren. Vielleicht ist das ganze auch anders möglich. Jedoch kenne ich mich mit dem datumsformat genauso wenig aus.

    die Uhrzeiten, die ich einlese sehen wie folgt aus:

    13:30:22.041 (std:min:sek:millisekunde)

    Áber schonmal vielen dank für eure hilfe 🙂

    Gruß
    Fiddler



  • #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
      char xyz;
      if (argc!=3) cerr << "...";
    
      ifstream zu(argv[1]);
      ofstream mir(argv[2]);
      while (zu.get(xyz)) mir.put(xyz);
    
      // jetzt musst du noch ein EOF code hinzuschreiben
    }
    


  • Hmmm, da steige ich nicht ganz durch!!

    Was soll anstelle von xyz stehen??

    mein Problem besteht darin, dass ich nicht weiß, wie ich einen string in ein int bekomme!

    Muss ich dafür den Umweg über char gehen? Ist es dann einfacher? Oder soll ich es in string belassen und die Uhrzeiten über eine Zeitfunktion, die ich nicht kenne voneinander subtrahieren?



  • zb über stringstream. Bei den FAQs findest du einen Beitrag dazu: Einmal Zahl nach string und zurück
    du solltest außerdem vor jeder frage zu den FAQs schauen.
    ein beispiel wäre nun

    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
    
    int main () {
    	string zeit("10:32:35:201");
    	stringstream ss(zeit);
    	int h,m,s,ms; char dummy;
    	ss >> h >> dummy >> m >> dummy >> s >> dummy >> ms;
    	cout << h << ' ' << m << ' ' << s << ' ' << ms << '\n';
    }
    


  • Vielen dank für die antwort 🙂 Davie du bist der größte 🙂


Anmelden zum Antworten