Alle Namen aus Datei ausgeben



  • Aufgabe:
    Schreiben Sie ein Programm, das alle in einer Datei vorkommenden Namen aus-
    gibt. Ein Name ist dabei so definiert: Er beginnt mit einem Buchstaben, anschließend
    folgen beliebig viele Buchstaben und Ziffern. Der Unterstrich zählt auch als Buchstabe.

    Musterlösung:

    #include <fstream>
    #include <iostream>
    
    bool istBuchstabe(char c) {
      return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_';
    }
    
    bool istAlphanumerisch(char c) {
      return (c >= '0' && c <= '9') || istBuchstabe(c);
    }
    
    int main(int argc, char* argv[]) {
      if (argc == 1) {
        std::cout << "Kein Dateiname in der Kommandozeile gefunden.\n"
                     "Gebrauch: "
                  << argv[0]  // Programmname
                  << " dateiname\n";
        return 0;
      }
    
      std::ifstream quelle(argv[1]);
      if (!quelle) {  // Fehlerabfrage
        std::cout << "Datei " << argv[1] << " nicht gefunden.\n";
        return 0;
      }
    
      char ch;
      bool namengefunden{false};
      while (quelle.get(ch)) {
        if (istBuchstabe(ch)) {
          std::cout << ch;
          namengefunden = true;
        } else if (namengefunden && istAlphanumerisch(ch)) {
          std::cout << ch;
        } else if (namengefunden) {
          namengefunden = false;
          std::cout << '\n';
        }
      }
      // quelle.close();  // macht der Destruktor
    }
    

    Hi,
    ich versuche gerade diese Lösung nachzuvollziehen.
    Zur Zeile 13 hätte ich eine Frage:
    argc ist doch die Anzahl der übergebenen Parameter.
    Warum soll "Kein Dateiname in der Kommandozeile gefunden.\n" ausgegeben werden,
    wenn doch argc == 1 ist. Dann wurde doch ein Parameter übergeben.


  • Mod

    Die auf allen bekannten Systemen übliche Konvention ist, dass der erste Parameter der Aufruf des Programms selbst ist. Man hat also immer mindestens einen Parameter. Diese Eigenschaft wird ja auch in Zeile 16 benutzt.



  • In argv[0] steht der name des programms. Das ist immer der erste parameter im argv array.
    z.b. wenn der code als "Aufgabe.exe" übersetzt wurde so steht in argv[0] "Aufgabe.exe"

    Zusätzliche Parameter wurden erst angegeben, wenn argc > 1 ist



  • @firefly Das ist irreführend. Es muss nicht der Name des Programms (also der vollständige Dateiname) sein.


  • Mod

    @firefly sagte in Alle Namen aus Datei ausgeben:

    In argv[0] steht der name des programms. Das ist immer der erste parameter im argv array.
    z.b. wenn der code als "Aufgabe.exe" übersetzt wurde so steht in argv[0] "Aufgabe.exe"

    Da steht drin, wie der Aufruf erfolgte. was oft, aber nicht notwendigerweise, der Name der Executable sein kann. Aber wenn diese Executable beispielsweise irgendeinen Alias im System hat, der benutzt wurde, dann steht dieser drin.



  • Danke für die Antworten!
    Die Zeile 16 finde ich verwirrend.
    Verständlich wäre etwas wie:
    "Programm ... wird ausgeführt, keine Einträge in Datei ... ."


  • Mod

    @theAnfänger77 sagte in Alle Namen aus Datei ausgeben:

    Danke für die Antworten!
    Die Zeile 16 finde ich verwirrend.
    Verständlich wäre etwas wie:
    "Programm ... wird ausgeführt, keine Einträge in Datei ... ."

    Dann verstehst du den Ablauf nicht richtig. Zeile 13 stellt fest, dass das Programm falsch aufgerufen wurde. Die Zeilen 14-17 zeigen dann einen Hilfetext an, wie das Programm korrekt aufgerufen wird. Das eigentliche Programm wird weder ausgeführt und erst recht nicht wird der Inhalt der Datei geprüft (Es wurde ja nicht einmal eine Datei angegeben!) .


Anmelden zum Antworten