Datei einlesen und ausgeben



  • Nabend zusammen,

    habe da ein kleines Problem und zwar, will ich gerne Dateien einlesen und ausgeben. Nur leider habe ich keine Ahnung wie.

    Habe zwar schon: http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Dateizugriff gefunden nur das hilft mir leider nur bedingt weiter.

    Weil mein Problem ist, dass ich die Dateien in folgenden Format einlese bzw. erzeugen will: 123.21;234.08;235.87;...;543.97

    Nur wie realisiere ich das, muss ich die Zeichen erst alle einzelt in ein Array zwischen speichern?!

    Hoffe ihr könnt mir helfen, danke!



  • Du kannst dich in std::fstream einlesen, um mit Dateien zu operieren. Die C++-Streams funktionieren insgesamt recht ähnlich. Wenn du also std::cout schon kennst (was ich stark hoffe, sonst solltest du dieses Kapitel nochmals nachholen), solltest du nicht allzu grosse Probleme haben.

    Ausgeben kannst du zum Beispiel so:

    std::ofstream output("datei.txt");
    output << 123.21 << ';' << 234.08 << ';' << 235.87 << ';';
    

    Klüger wärs natürlich in einer Schleife. Möglicherweise brauchst du was array-artiges, dann rate ich aber eher zu STL-Containern. Und als Nachschlagewerk über die Standardbibliothek ist www.cplusplus.com eine gute Anlaufstelle.

    Hast du eigentlich kein C++-Buch, wo solche Dinge besprochen werden? Falls nein, rate ich dir dringend, eins anzuschaffen. Internettutorials bringens langfristig gesehen überhaupt nicht, denn viel zu oft wird wichtiges Hintergrundwissen unterschlagen, das dir nachher fehlt und dir ständig Mühe bereitet. Oft empfohlene Bücher sind der C++-Primer und Thinking in C++ (gibts auch gratis als Online-PDF).



  • Hi

    Ich habe alle meine C++ Kenntnisse über Tutorials bekommen, also möglich ist es schon. Ich finde ein wesentlicher Vorteil von Online-Tutorials ist, das man am Anfang sich einfach Code-Fragmente die Syntaktisch korrekt sind per Copy & Paste in seinen Quelltext einbauen kann. Allerdings muss ich auch sagen, das pointer in Online-Tutorials so knapp gehalten werden, dass ich bis heute nur sagen kann das ich es Ansatzweise verstanden habe.

    MfG cobra11freak


  • Administrator

    cobra11freak schrieb:

    Ich habe alle meine C++ Kenntnisse über Tutorials bekommen, also möglich ist es schon.

    cobra11freak schrieb:

    Allerdings muss ich auch sagen, das pointer in Online-Tutorials so knapp gehalten werden, dass ich bis heute nur sagen kann das ich es Ansatzweise verstanden habe.

    Zeigt das nicht schön auf, dass man eben nicht über Tutorials lernen sollte, sondern mit einem guten Buch? 😉
    Und wenn es bereits bei Zeigern scheitert, da fragt man sich, wo es sonst noch an C++ Wissen fehlt.

    Im übrigen:

    cobra11freak schrieb:

    Ich finde ein wesentlicher Vorteil von Online-Tutorials ist, das man am Anfang sich einfach Code-Fragmente die Syntaktisch korrekt sind per Copy & Paste in seinen Quelltext einbauen kann.

    Die meisten Bücher bringen eine CD mit oder bieten eine URL an, wo man die Code-Fragmente im Buch herunterladen kann.

    Und weil er gerade erst in RudP kam:
    http://web.archive.org/web/20080503082244/http://scientificninja.com/advice/dont-write-tutorials

    Grüssli



  • Als ich mich fürs programmieren entschied, wollte ich auch erst mal C lernen, auch mit Hilfe von Online-Tutorials.
    Fand ich auch net so der Renner, bin dann eh auf C++ umgestiegen und habe die beiden Bücher, C++ in 21 Tage und den C++ Primer.
    Wird echt alles eigentlich beschrieben, und mann hat auch immer was zum nachschlagen und suchen;-)

    Gruß freeG



  • erst einmal danke für die Hilfe.

    Vielleicht habe ich mich etwas unklar ausgedrückt (sry dafür).

    Ich will halt in eine Datei schreiben und aus einer Datei die Werte auslesen und in ein Array speichern.

    "Vorlageformat" sieht halt so aus: 123.21;234.08;235.87;...;543.97

    Und ich möchte halt, wenn ich diese einlesen wie folgt haben:
    array[1] = 123.21
    array[2] = 234.08
    ...

    Genau so will ich dieses Array dann abspeichern, also vom "array" nach "123.21;234.08;235.87;...;543.97" in der Datei.

    Danke.



  • ah ok... also was nettes jetzt gefunden 🙂

    Das schreiben in eine Datei müsste dann so aussehen:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main () {
      ofstream myfile ("example.txt");
      if (myfile.is_open())
      {
        for (i=0; i=x; i++
        {
          if(i!=x)
          {
            myfile array[i] << ";"; // = array[1] = 123.21; array[2] = 234.08 ... array[x] = 543.97
          } else {
            myfile array[i]; 
          }
        }
        myfile.close();
      }
      else cout << "Unable to open file";
      return 0;
    }
    

    dann wäre der Inhalt: 123.21;234.08;235.87;...;543.97.

    Und genauso müsste ich dann das Einlesen machen:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main () {
      string line;
      ifstream myfile ("example.txt");
      if (myfile.is_open())
      {
        while (! myfile.eof() )
        {
          getline (myfile,array); // wäre dann die EINE Zeile: 123.21;234.08;235.87;...;543.97
        }
        myfile.close();
      }
    
      else cout << "Unable to open file"; 
    
      return 0;
    }
    

    nur, wie bekomme ich dann diesen String in ein Array?!... Muss ich das mit "strtok" machen? Nur wie?



  • Ich würde das eher so schreiben:

    #include <fstream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
        vector<double> Zahlen;
        double tmp;
        ifstream file("Beispiel.txt");
        while (!file.eof())
        {
            file >> tmp >> ';';
            Zahlen.push_back(tmp); 
        }
    }
    


  • ok... also heißt das jetzt so viel:

    1. Vector = Dyn. Array?

    file >> tmp >> ';';
    

    löscht mir das ; von der dementsprechende Zahl und speichert diese in tmp?

    Zahlen.push_back(tmp);
    

    schreibt tmp in das dynamische Array wobei der index immer um 1 erhöht wird?

    vielen Dank!



  • B1ND3R schrieb:

    ok... also heißt das jetzt so viel:

    1. Vector = Dyn. Array?

    file >> tmp >> ';';
    

    löscht mir das ; von der dementsprechende Zahl und speichert diese in tmp?

    Zahlen.push_back(tmp);
    

    schreibt tmp in das dynamische Array wobei der index immer um 1 erhöht wird?

    vielen Dank!

    1. Korrekt, man kann auch beim Konstruktor die Größe angeben: vector<double> Zahlen(100);

    2. Liest eine Zahl in tmp und dann ein Semikolon. Das Semikolon wird in keine Variable geschrieben.

    3. Vergrößert das Array um 1 und schreibt dann tmp ans Ende.



  • Super dank dir! GLeich mal ausprobieren 🙂



  • also habe jetzt mal den Kram implementiert. Bei der einlese-Funktion kommt folgender Fehler:
    http://www.imagebanana.com/img/6uctkmwn/thumb/Unbenannt.JPG

    sowie beim close: "statement kann die Adresse der überladenen Funktion nicht ausführen".

    Habe folgendes insg. included:
    - iostream
    - fstream
    - vector
    - stdio
    - string

    und dazu halt namespace std.

    Nur wenn ich diesen namespace std. wieder lösche bekomme ich einen fehler bei "ifstream quelle" und zwar: "ifstream wurde in diesem Gültigkeitsbereich nicht definiert" und "expected ';' before quelle" und dann bekomme ich noch einen fehler bei "quelle.open(datei) und zwar: "quelle wurde in diesem Gültigkeitsbereich nicht definiert"

    nochmals danke für die hilfe 🙂


  • Mod

    cin >> tmp >> ':';
    

    Das >> ':' ist Quatsch. Was soll das machen? Ich kann dir nicht einmal sagen, was richtig wäre, weil ich nicht begreife, warum du das dort überhaupt hingeschrieben hast.



  • Oh, Sorry, ich dachte, das ginge so wie bei scanf:

    fscanf(datei, "%f;", Zahl);
    

    Dann würde ich es so schreiben: (diesmal auch getestet)

    #include <fstream>
    #include <vector>
    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    int main()
    {
        vector<double> Zahlen;
        double tmp;
        char ch;
        ifstream file("Beispiel.txt");
        while (!file.eof())
        {
            file >> tmp >> ch;
            if(ch != ';') cout << "Fehlerhaftes Dateiformat";
            Zahlen.push_back(tmp);
        }
    }
    


  • ja das hilft danke 🙂

    eine Frage habe ich noch. Und zwar, habe ich ja eine Schleife, wo ich 21 Datein in ein großes Array speichern will - Problem ist nur er ließt immer die gleiche Datei ein, obwohl ich den Dateinname dementsprechend ändere.

    Muss ich eine Datei auch wieder schließen wenn ich diese geöffnet habe - logischerweise ja, nur wenn ich das mache, siehe Bild: http://www.imagebanana.com/view/6uctkmwn/Unbenannt.JPG

    dann bekomme ich ein: "statement kann die Adresse der überlaufenden Funktion nicht auflösen".

    kann mir einer noch helfen bei dem "letzten" Prob 🙂 😃



  • Du hast bei close die () vergessen.
    Was heißt dementsprechend ändern? Rufst du immer die open()-Methode der Datei auf mit dem neuen Dateinamen?



  • Ja ich rufe in der schleife die open funktion immer wieder auf, nur mit anderen Dateinamen.

    So fehler gefunden. Lag daran, dass ich vergessen habe, dass "push_back" bis ins "unendliche" zählt, ich aber immer wieder nur auf den anfang zugegriffen habe.

    Also vielen Dank, allen die mir geholfen haben 🙂


Anmelden zum Antworten