Zeichen von einer Datei in die andere!!
-
Vielleicht liegts an meinem Browserchache aber der While-Kopf is immer noch falsch
Beachte vor allem dass es sich bei eof() um eine Funktion handelt, nicht um eine Variable. Dein Datenmüll-Problem wird wohl auch damit zusammenhängen, dass der datum-String nicht 0-terminiert ist.
-
Naja...immer noch Fehler...
... void daten_lesen(char *quelle, char *ziel) { 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 ifstream eingabedatei (quelle, 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 (i=3; i < 13; i++) { datum[i-3] = zeile[i]; } ausgabedatei << datum << endl; eingabedatei.getline(zeile,100); } }
Ansonsten ist das so korrekt würde ich sagen. Und er greift auf die datei zu in der while, aber nícht in der for-Schleife was er auch gar nicht braucht! Besser wäre aber wenn Datum string wäre. Habe ich nicht geschrieben, weil mir der Befehl fürs kopieren nicht einfällt und ich keine lust habe nachzuschlagen...
Code-Hacker
-
Hallo nochmal!!!
Also den "iso::in und iso::out"" - kram übergebe ich mit, wobei ich ich beim ofstream auf out verzichte, da ich die datei bei jedem ausführen der Codes komplett überschreiben will. Bisher hab ich auch iso::app nicht mit eingebuden .
Wird wohl an der Terminierung liegen. Danke schonmal für den hinweis. ich werde es dann mal morgen probieren, und mich dann nochmal melden
-
Code-Hacker schrieb:
Naja...immer noch Fehler...
... void daten_lesen(char *quelle, char *ziel) { 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 ifstream eingabedatei (quelle, ios_base::in); //löschen und modifierung verhindern
ofstream öffnet zum schreiben, ifstream zum lesen. Deine Parameter sind quatsch.
Ansonsten ist das so korrekt würde ich sagen.
Nee, nullterminierung fehlt noch. Aber wurde ja schon gesagt.
Und er greift auf die datei zu in der while
Aber noch nicht als ich die Bemerkung geschrieben habe
-
Die sind nicht quatsch sondern korrekt, kannst du in jedem Buch nachlesen:
in: Datei wird zum lesen geöffnet
out: Datei wird zu schreiben geöffnet
app: Ausgabe wird ans Ende der datei gehängt
trunc: Löscht Inhalt einer Datei
Natürlich habe ich Zusätze die bei der Beschreibung dabei sind weggelassen.Die Nullterminierung kann er ja selbst noch dranhängen.
Axso, wusst ich net, dass es da noch nicht drin stand.
Code-Hacker
-
Code-Hacker schrieb:
Die sind nicht quatsch sondern korrekt, kannst du in jedem Buch nachlesen:
in: Datei wird zum lesen geöffnet
out: Datei wird zu schreiben geöffnet
app: Ausgabe wird ans Ende der datei gehängt
trunc: Löscht Inhalt einer DateiWenn in deinem Buch ofstream(.. ios::in..) steht, dann schmeiß es weg.
Das ist quatsch. Eindeutig.
-
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 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