Datei lesen/schreiben/ändern ...



  • 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.



  • 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é


Anmelden zum Antworten