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



  • 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