Datei lesen/schreiben/ändern ...
-
Hallo,
ich habe zwar mal c gelernt in einem Kurs, krieg es jetzt aber nicht mehr auf die Reihe.
Ich sitze hier in einer Firma (als Ferienarbeiter) und soll ein ganz einfaches Programm schreiben, zuhause würde ich es mit visual studio machen aber das trau ich mich hier nicht von wegen commercial use, noch dazu habe ichh hier keine compiler, ich mach es also lieber mit c++.Ich soll bei einem Textfile das wie folgt aussieht:
----- asdfas df ----- as df df d- d-fdf- d ad da dd aa df -----Die Zeilen mit ---- Löschen.
Mit c# würde ich wohl prüfen ob das erste Zeichen - ist und falls ja die Zeile löschen (und in eine andere Datei speichern)
Hier schwebt mir irgendetwas vor von wegen "wenn das zeichen - ist und das nächste zeichen auch - dann lösche das - nächstes zeichen" und dann muss ich wohl das /n noch irgendwie mitlöschen.Leider habe ich keine Ahnung mehr wie das in C ging, mir wurde es damals mit der stdio.h Bibliothek beigebracht und dazu habe ich keine Hilfe gefunden.
Irgendwie kann C zwar auch Streams lesen aber ich stehe wirklich da wie der Ochs vorm Berg und komm nicht weiter...
-
Also der Text ist zu lang geworden, kurz nochmal:
Ich will ein Programm schreiben das eine Datei "Test1.txt" liest, und alle Zeilen die nicht mit "-" anfangen in "Test2.txt" schreib.
Kann C++ überhaupt Zeilenweise lesen?
-
-
Gerold P. schrieb:
Kann C++ überhaupt Zeilenweise lesen?
Thema "getline" (Kommt in mindestens einen Beispiel in den Links vor).
-
So in etwa, ungetestet, runtergeschrieben:
#include <iostream> #include <fstream> #include <string> using namespace std; int main(int argc, char* argv[]){ ifstream in(argv[1]); ofstream out(string(argv[1])+string(".out")); string buffer; while(getline(in, buffer)){ if (buffer[0] != '-') out << buffer; } in.close(); out.close(); }Benutzung: ./meinProgramm infile
Ausgabe in infile.out
-
Waoh ihr seid super, gleich so viele Antworten:)
Ich muss erst mal die Informationen verarbeiten bevor ich sagen kann ob ich damit zurechtkomme, aber ich gehe stark davon aus, also schon mal vielen Dank!
-
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream in("input.txt"); ofstream out("output.txt"); string buffer; while(getline(in, buffer)) { if (buffer[0] != '-') out << buffer << endl; } in.close(); out.close(); }Sooo, ich nehme an Buffer[0] ist das erste Zeichen des Arrays.
Ich nehme an "<<" heißt soviel wie "füge zu dem was links steht hinzu"
getline habe ich noch nicht ganz verstanden, denn laut der hilfe von asc fehlt da noch ein dritter wert, der sagt wann die line aus ist. Ist das per default /n und man kann es deshalb weglassen? wenn ich getline(in, buffer, /n) schreibe bekomme ich einen error.
zu guter letzt verstehe ich die ifstream und ofstream zeilen auch noch nicht, aber das brauch ich jetzt auch nicht:)
Vielen Dank nochmal:)
-
Gerold P. schrieb:
Sooo, ich nehme an Buffer[0] ist das erste Zeichen des Arrays.
Richtig. std::string ist eine "etwas" erweitertere und "sicherere" Variante des guten alten C-Char-Arrays.
Ich nehme an "<<" heißt soviel wie "füge zu dem was links steht hinzu"
Das ist in diesem Fall der Streaming-Operator, der das was "rechts steht" in den Stream schreibt, der "links steht".
getline habe ich noch nicht ganz verstanden, denn laut der hilfe von asc fehlt da noch ein dritter wert, der sagt wann die line aus ist. Ist das per default /n und man kann es deshalb weglassen? wenn ich getline(in, buffer, /n) schreibe bekomme ich einen error.
Der dritte Parameter hat als Default-Wert '\n', wenn man ihn denn nicht angibt.
Und was heißt "bekomme ich einen error"?
zu guter letzt verstehe ich die ifstream und ofstream zeilen auch noch nicht, aber das brauch ich jetzt auch nicht:)
Schadet aber auch nicht das zu verstehen.
Die ersten beiden Zeilen erzeugen ein Objekt vom jeweiligen Streamtyp (if == input file, of == output file stream).
Die letzten beiden schließen die beiden Streams wieder.Dazwischen wird getline als erster Parameter der input-Stream übergeben, während drunter in den output-Stream geschrieben wird.
-
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.