Datei lesen/schreiben/ändern ...
-
Fellhuhn schrieb:
Der dritte Parameter hat als Default-Wert '\n', wenn man ihn denn nicht angibt.
Und was heißt "bekomme ich einen error"?
Ich gehe davon aus das er es genau so eingegeben hat wie angezeigt. /n alleine ist kein Zeichen, auch \n nicht, es muss schon in einfachen Hochkommatas angegeben werden, und Escapesequenzen beginnen mit "\" nicht mit "/" wie er es angegeben hatte:
\n - Ungültig
/n - Ungültig
'\n' - Gültig, Zeilenumbruch
'/n' - Ungültig, zwei Zeichen
"\n" - Gültig, String mit 2 Zeichen (Zeilenumbruch und 0x0)
"/n" - Gültig, String mit 3 Zeichen ("/", "n" und 0x0)cu André
-
Dachte ich mir, dass es so etwas wie "Datei lesend öffnen" und "Datei schreibend öffnen" heißt. Gibt sicher auch noch andere Methoden, steht wohlauch im Hilfe Link.
ABER: Mein Programm funktioniert gerade nicht mehr.
Alles was ich tun wollte ist, eine Funktion zu schreiben:void test() { // Aktualisiert und Überarbeiter die status00_1 Query ifstream in("input.txt"); ofstream out("output.txt"); // Funktion: Kopieren falls erstes Zeichen der Zeile | string buffer; while(getline(in, buffer)) { if (buffer[0] == '|') out << buffer << endl; } in.close(); out.close(); } int main() { test(); }ich schätze mal es liegt an dem void dass ich nur noch leere dateien krieg, aber ich mach jetzt erst mal mittag;-)
-
Hmm, also ich hab in der Mittagspause nachgedacht... an dem void kann es auf keinen Fall liegen... Ich kriegs nicht mehr hin.
Hilfe?
-
Gerold P. schrieb:
ABER: Mein Programm funktioniert gerade nicht mehr.
...
ich schätze mal es liegt an dem void dass ich nur noch leere dateien krieg, aber ich mach jetzt erst mal mittag;-)Mit Sicherheit nicht. Dem Code ist es an sich vollkommen egal wie die Funktionssignatur der Funktion ist, in der er liegt. Könnte es sein das die Eingabedatei überschrieben wurde (sprich: leer ist)?
cu André
-
Also, ich habe Testweise den Pointer geändert, und versucht mit Buffer[1] auf das erste Zeichen im Array zu zeigen. Die Arbeitszeit hat sich dadurch locker vervierfacht, in den Dateien steht zwar wieder etwas drin, aber mit Leerzeichen zwischen jedem Zeichen.
Ich hätte mir jetzt diese If-Klausel mal genauer angeschaut, meiner Meinung nach die einzig mögliche Fehlerquelle, weil hier geschrieben wird.
Original, das auch Funktioniert hatte:
while(getline(in, buffer)){ if (buffer[0] != '-') out << buffer; }Meine Aktuelle Version:
while(getline(in, buffer)) { if (buffer[0] != '-') out << buffer << endl; }Ich habe dieses "endl" hinzugefügt, da ich zuvor keine Zeilenumbrüche hatte.
while(getline(in, buffer)) { ... }, ich glaub ich versteh nichtm al das, ich bin kurz vorm aufgeben.
müsste das nicht heißen "während getline werte zurückgibt mache { ... }, nächste zeile" irgendwie? also ausgeschrieben? irgendwo müsste da ein boolscher operator stehen, den man aber auch weglassen kann? und getline springt automatisch weiter?ach.......
-
Edit:
Den Fehbler hab ich, aber lösen kann ich ihn nicht:
Ich habe zuvor mit einer von Windows erstellten TXT File gearbeitet, damit funktioniert es.
Jetzt arbeite ich mit einer von R/3 erstellten TXT File, die anders Formatiert ist (ich glaube UNICODE), daher werden meine Zeichen nicht mehr erkannt die ich mit '' eingebe.
Wie kann ich damit umgehen?
Neuen Thread?
-
naja vielleicht auch doch nicht... L'-' hilft nicht...
-
Gerold P. schrieb:
Also, ich habe Testweise den Pointer geändert, und versucht mit Buffer[1] auf das erste Zeichen im Array zu zeigen.
Von welchen Pointer oder welchen Array sprichst du nun?
Gerold P. schrieb:
Ich hätte mir jetzt diese If-Klausel mal genauer angeschaut, meiner Meinung nach die einzig mögliche Fehlerquelle, weil hier geschrieben wird...
Den einzigen Unterschied in den beiden Versionen ist, das du jedesmal das Zeilenende hinzufügst und anschließend direkt in die Datei zurückschreibst. "endl" macht mehr als nur ein '\n', ich würde hier tatsächlich zu der Escapesequenz greifen aus Performanceaspekten.
Ich habe dieses "endl" hinzugefügt, da ich zuvor keine Zeilenumbrüche hatte.
Gerold P. schrieb:
while(getline(in, buffer)) { ... }, ich glaub ich versteh nichtm al das, ich bin kurz vorm aufgeben.
while(getline(in, buffer)) // Lese solange Zeilenweise von einen Stream in einen // String (buffer), bis das Dateiende erreich wird { // <-- hier steht im String "buffer" der Zeileninhalt. // ... }Um es noch genauer zu beschreiben:
getline(in, buffer)
Liest die nächste Zeile aus dem Eingabestream (in) in den String (buffer) aus.while(getline(in, buffer))
Geht genau dann in den Schleifenblock wenn getline eine gültige Zeile auslesen konnte.Gerold P. schrieb:
müsste das nicht heißen "während getline werte zurückgibt mache { ... }, nächste zeile" irgendwie? also ausgeschrieben? irgendwo müsste da ein boolscher operator stehen, den man aber auch weglassen kann? und getline springt automatisch weiter?
getline liefert einen Ausdruck zurück, der in bool konvertiert werden kann.
Was du aber tunlichst nicht machen darfst ist gleichzeitig aus einen Stream zu lesen den du gleich wieder beschreibst (Also in/out gleich zu wählen).
cu André
-
Gerold P- schrieb:
Wie kann ich damit umgehen?
Je nach Kodierung könnte es funktionieren in dem du die "Wide"-Varianten der Strings und Streams verwendest:
void test() { wifstream in("input.txt"); wofstream out("output.txt"); wstring buffer; while(getline(in, buffer)) { if (buffer[0] == L'|')) // Beim L'|' bin ich mir nicht sicher ob das so geht out << buffer << L"\n"; } in.close(); out.close(); }
-
Danke André, werd ich gleich probieren.
Peh
-
Also es gibt bei mir (Dev-C++) kein
#include <wiostream> #include <wfstream> #include <wstring>daher steht bei mir immer undeclared (first use this function)
-
Es gibt auch garkeine Header dieses Namens, nur Klassen, die in den Headern ohne w enthalten sind.
Aber der olle MinGW bietet die wstream-Klassen tatsächlich nicht an.
-
Gerold P. schrieb:
...Dev-C++...
ist inzwischen schon sowas von veraltet das damit vieles nicht funktionieren kann (Alternative unter Windows sind z.B. die kostenlosen Expressversionen von Microsoft oder Code::Blocks oder wie das heißt).
cu André
-
Veraltet? Hmmm... darauf hab ich damals C++ gelernt... fands eigentlich gar nicht so schlecht.
Wie schon gesagt, zuhause benutze ich auch Visual Studio aus dem MSDN-AA, aber das ist mehrere hundert Megabyte groß und ich habe hier beschränkten Platz.
aber stimmt, man kann auch c++ mit vs schreiben... vielleicht muss ich da dann auch keine Angst haben dass es auf Rechnern ohne .NET nicht läuft.Was soll ich sagen... ich bin nur Hobbyprogrammierer, ich bin da nicht so auf dem laufenden... und in letzter Zeit hab ich auch fast nur VB programmiert... ich habe nur was kleines (<10 MB) und kommerziell nutzbares für dieses Progrämmchen gesucht mit den ich versuche mir ein paar Euros hinzuverdienen versuche.
hab das zuhause angeguckt, dachte mir wenn ich sowas wie die streamwriter klasse in c++ finde und den alten kostenlosen c++ compiler finde, krieg ich das schnell hin ^^
-
Gerold P. schrieb:
...man kann auch c++ mit vs schreiben... vielleicht muss ich da dann auch keine Angst haben dass es auf Rechnern ohne .NET nicht läuft.
Wenn du als Projekttyp Win32 Console Application oder so ähnlich wählst, braucht das erstellte Programm maximal die C++ Runtime Umgebung (Wenn du statisch links wird sie reinintegriert, letzteres macht glaube ich auch deine Umgebung)...
Gerold P. schrieb:
hab das zuhause angeguckt, dachte mir wenn ich sowas wie die streamwriter klasse in c++ finde und den alten kostenlosen c++ compiler finde, krieg ich das schnell hin ^^
Wie gesagt google mal nach "Visual C++ 2008 Express", der ist kostenlos (enthält aber z.B. keine MFC) und man kann auch kommerziell damit arbeiten.
cu André