[gelöst]Erlärung/Kommentierung eines kleinen Programms



  • probier mal:

    #include <iostream> //Falls du das noch nicht hast
    // ...
    int main(int argc, char** argv) {
      // ...
      std::cout<<"Drücke Enter zum Beenden"<<std::endl;
      std::cin.get();
      return 0;
    }
    


  • Ich hab ja auch gedacht, dass das Prog zu schnell arbeitet. Aber das kann nciht sein, denn
    1.) Ich lese eine Datenreihe mit 2000 Daten ein
    2.) Die modifizierte Datei muss im C-Lw sein. Ist es aber nicht.
    Daraus folgt mich, dass die fkt. nicht aufgerufen wird, so wie ich das da stehen hab (post von cooky ist mein prog, nochmal zur erinnerung)



  • Hast du zufällig Windows 7 und gibst dem Programm keine Schreibrechte für C? Vielleicht solltest du mal auf is.is_open() und of.is_open() testen. (Bzw. .good())



  • Ich hab Win7, aber schreibrechte sind ohne Ende vorhanden.
    Nochmal: Wenn ich das ohne diesen Teil mache:

    int main() 
     { 
         Funktion_Zeilennnummer(); 
     }
    

    also meine Fkt "Zeilennummer" als main-fkt aufrufe, dann läuft ja alles (Was aber für mich, unbedeutend ist).
    Deshalb gehe ich ja davon aus, dass die fkt. so gar nicht aufgerufen wird, warum auch immer.



  • Das Programm von cooky enthält keine Funktionen zum Aufhalten des Fensters.

    Probiers mal so:

    #include <iostream>
    #include <iomanip>
    #include <fstream>
    #include <vector>
    #include <string>
    #include <cstdlib>
    
    using namespace std;
    
    int digits(int n)
    {
       int r=1;
       while (n/=10) ++r;
       return r;
    }
    
    void Funktion_Zeilennnummer()
    {
         ifstream is("C:\\Datenreihe.txt"); // Fileinputstream
         ofstream of("C:\\Datenreihe_modi.txt");
         vector<string> v; // Container
    
         if (!is.good()) { std::cerr << "Fehler beim Oeffnen: is\n"; return; }
         if (!of.good()) { std::cerr << "Fehler beim Oeffnen: of\n"; return; }
    
         string tmp;
         while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen
         int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung
    
         for (std::size_t i=0; i<v.size(); ++i)
         {  // Rücke doch bitte ordentlich ein
           cout << setw(n) << i << ' ' << v[i] << endl;
           of<< setw(n) << i << ' ' << v[i] << endl;
         }
    }
    
    int main()
    {
        Funktion_Zeilennnummer();
    
        std::cout<<"Drücke Enter zum Beenden"<<std::endl;
        std::cin.get();
    
        return 0;
    }
    


  • @sdsfd: Ich hab "dein" Prog einfach mal rüber kopiert und es funzt...
    Ich gucke mal, aber ich habe es genau so 😕
    Sry für die Verwirrung an alle.

    Neeeeeeeeeeeeeiiiin. Asche auf mein Haupt. Das kann ja nciht funktionieren:

    int main ()
    { 
    	void Funktion_Zeilennnummer(); 
    	cout<<"Drücke Enter zum Beenden"<<endl;
    	cin.get();
    	return 0;
    }
    

    Tut mir echt leid!!!



  • Ich glaube, so langsam herrscht hier Verwirrung. Vielleicht machst du nochmal in einem kurzen Beitrag klar, WAS du genau erreichen willst.



  • Ich wollte das Programm:

    int digits(int n) { 
        int r=1; 
        while (n/=10) ++r; 
        return r; 
      } 
    
    int main(int argc, char *argv[]) 
      { 
          ifstream is("in.txt"); // Fileinputstream 
          vector<string> v; // Container 
    
          string tmp; 
          while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen 
          int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung 
    
          for (int i=0; i<v.size(); ++i) 
              cout << setw(n) << i << ' ' << v[i] << endl; 
      }
    

    für meine Wünsche umändern. Dazu gehörte: Eine zusätzliche Ausgabe in eine modifizierte Datei und diese main-Funktion (die später den fkt-Namen Zeilennummer kriegt) VON einer main-fkt starten lassen.
    Das, ist das Ergebniss:

    #include <iostream>
    #include <iomanip>
    #include <fstream>
    #include <vector>
    #include <string>
    #include <cstdlib>
    
    using namespace std;
    
    int digits(int n)
    {
       int r=1;
       while (n/=10) ++r;
       return r;
    }
    
    void Funktion_Zeilennnummer()
    {
         ifstream is("C:\\Datenreihe.txt"); // Fileinputstream
         ofstream of("C:\\Datenreihe_modi.txt");
         vector<string> v; // Container
    
         if (!is.good()) { std::cerr << "Fehler beim Oeffnen: is\n"; return; }
         if (!of.good()) { std::cerr << "Fehler beim Oeffnen: of\n"; return; }
    
         string tmp;
         while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen
         int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung
    
         for (std::size_t i=0; i<v.size(); ++i)
         {  
           cout << setw(n) << i << ' ' << v[i] << endl;
           of<< setw(n) << i << ' ' << v[i] << endl;
         }
    }
    
    int main()
    {
        Funktion_Header();
        Funktion_Zeilennnummer();
        Funktion_Einlesen();
        Funktion_Mittelwert();
        Funktion_Maximalwert();
        Funktion_Minimalwert();
        Funktion_Ausgabe();
    
        return 0;
    }
    

    Mit

    int main ()
    { 
        void Funktion_Zeilennnummer(); 
        return 0;
    }
    

    dem void vor dem Funktionsaufruf, konnte das ja nichts werden...Was leider mein Fehler war, welches ich nicht bemerkt hab.

    In diesem Zusammenhang nochmal zwei Fragen:
    1.) Muss ich nciht theoretisch gesehen nich mit "is.close()" und "of.close(), die Dateien schließen?
    2.) Das Programm wird weitergeschrieben. Für weitere Fragen, sollte ich ein anderes Thema eröffnen?



  • Einstein jr. schrieb:

    Das, ist das Ergebniss:

    #include <iostream>
    #include <iomanip>
    #include <fstream>
    #include <vector>
    #include <string>
    #include <cstdlib>
    
    using namespace std;
    
    int digits(int n)
    {
       int r=1;
       while (n/=10) ++r;
       return r;
    }
       
    void Funktion_Zeilennnummer()
    {
         ifstream is("C:\\Datenreihe.txt"); // Fileinputstream
         ofstream of("C:\\Datenreihe_modi.txt");
         vector<string> v; // Container
    
         if (!is.good()) { std::cerr << "Fehler beim Oeffnen: is\n"; return; }
         if (!of.good()) { std::cerr << "Fehler beim Oeffnen: of\n"; return; }
    
         string tmp;
         while (getline(is, tmp)) v.push_back(tmp); // zeilenweise einlesen
         int n = digits(v.size()+1); // Anzahl Ziffern für Nummerierung
         
         for (std::size_t i=0; i<v.size(); ++i)
         {  
           cout << setw(n) << i << ' ' << v[i] << endl;
           of<< setw(n) << i << ' ' << v[i] << endl;
         }
    }
    
    int main()
    {
        Funktion_Header();
        Funktion_Zeilennnummer();
        Funktion_Einlesen();
        Funktion_Mittelwert();
        Funktion_Maximalwert();
        Funktion_Minimalwert();
        Funktion_Ausgabe();
    
        return 0;
    }
    

    Bist du mit deinem Ergebnis nun soweit zufrieden? 🙂

    Einstein jr. schrieb:

    In diesem Zusammenhang nochmal zwei Fragen:
    1.) Muss ich nciht theoretisch gesehen nich mit "is.close()" und "of.close(), die Dateien schließen?

    Nein. open() und close() werden delegiert. open() macht der Konstruktor, close() macht der Destruktor. (Stichwort: RAII)

    Einstein jr. schrieb:

    2.) Das Programm wird weitergeschrieben. Für weitere Fragen, sollte ich ein anderes Thema eröffnen?

    Ich würde sagen ja... finde es hier langsam unübersichtlich.

    edit: verschrieben.



  • Ob ich zufrieden bin??? Ich bin mehr als zufrieden, dank eurer Hilfe 😃
    So macht Info, noch Spaß.

    @open&close: Das gilt aber nur wenn ich: "ifstream is ()" nutze. Bei "ifstream.is ; is.open()" gilt das nicht. Da muss noch ein close() so weit ich das verstanden hab, oder?
    Ich hoffe das war die letzte Frage in diesem Topic 😃



  • Nein, die Datei wird im Destruktor immer geschlossen. close() aufzurufen lohnt eigentlich nur, wenn du einen guten Grund dazu hast. (z.B. der Scope {} ist noch länger und du willst die Datei früh schließen. Allerdings könnte man hier auch einen extra Scope einführen, das ist kein Problem.)

    int main()
    {
      {
        std::ifstream infile("in.txt");
        ..
      }
      ..
    }
    

    Das musst du dann abwägen was dir lieber ist. (Momentan ist es dir aber völlig egal wann und wo geschlossen wird, es wird geschlossen und das ist die Hauptsache.)



  • Dankeschööön...An alle. Ihr habt mir geholfen.


Anmelden zum Antworten