Zeichen von einer Datei in die andere!!
-
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 inwhile(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 Verstandifstream 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