C++ Eingabe?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von nofuture, 14. Juli 2005 .

Schlagworte:
  1. 14. Juli 2005
    hi ich hab in der Schule dieses Programm geschrieben
    das problem ist nur ich weiß nich mehr wie ich die Eingabe
    hinbekomme und warum mein Compiler sich immer
    beklagt


    Code:
     DAs ist meine main
    
    #include <iostream>
    #include <string.h>
    #include "save.h"
    
    using namespace std;
    
    struct TListe {
     char Name[20];
     char Tele[20];
     };
     
    
    /************ MAIN ***************/
    
    int main(){
     char Ende;
     TListe Liste[3];
     int ListenPlatz;
     Speichern(Liste ListenPlatz);
     cout<<"---------------------------------------------"<<endl;
     cout<<"Liste wird ausgegeben "<<endl;
     cout<<"---------------------------------------------"<<endl;
     for(ListenPlatz=0;ListenPlatz<3;ListenPlatz++) {
     cout<<"Mitgliedsnummer;"<<ListenPlatz<<endl;
     cout<<Liste[ListenPlatz].ZuNamen;
     cout<<Liste[ListenPlatz].TelefonNummer;
     }
     
     fclose(Datei);
     
     Speichern(Liste,ListenPlatz); 
     cin >>Ende;
     }
    
    
    
    und das ist die Save.h
    
    
    
    #include <iostream>
    #include <cstdlib>
    #include <string.h>
    
    /************ Speichern *************/ 
     
    int Speichern(TListe List[3], int Listenplatz) {
     cout<<"---------------------------------------------"<<endl;
     cout<<"Liste wird gespeichert"<<endl;
     cout<<"---------------------------------------------"<<endl;
     FILE* Datei;
     Datei=fopen("Adressen.html","wt");
     for(ListenPlatz=0;ListenPlatz<3;ListenPlatz++) {
     strcpy(Zeile,Liste[ListenPlatz].ZuNamen);
     fputs("<br>",Datei);
     strcpy(Zeile,Liste[ListenPlatz].TelefonNummer);
     fputs("<br>",Datei);
     }
     fclose(Datei);
     }
    
    
    und kann mir jetzt einer sagen wo der fehler liegt??
     
  2. 14. Juli 2005
    Hallo,
    ich habe deinen Thread Titel etwas angepasst, ich bitte dich beim Naechsten Mal darauf zu achten was fuer einen Titel du waehlst.
     
  3. 15. Juli 2005

    Ein Wunder das der Compiler überhaupt etwas anzeigt. Auf den ersten Blick fallen leider zahlreiche Fehler auf.
    1. Wohin kopierst du die Daten in der save.h? "Zeile" ist nämlich überhaupt nicht deklariert!
    2. In einer Header Datei werden keine Funktionsdeklerationen gemacht.
    3. Dein Code vermischt C und C++ auf sehr konfuse Weise.
    4. Dein Code enthält einige Groß- Klein- Schreibfehler.
    5. struct enthält Elemente wie char Name[20]. Im Code wird auf nicht existente Elemente wie ZuNamen zugegriffen.
    6. Deine main() versucht am Ende eine Datei zu schließen dessen Filepointer sie gar nicht kennt.
    7. Du includierst die string Klasse und benutzt dennoch char arrays. Warum???
    8. ...

    Ich habe den Code schnell überarbeitet ohne deinen Sinn zu verändern. Denn es gibt bessere Wege diesen zu realiseren. Exception Handling für gültige Eingabe und Vectoren wären zudem auch ratsam. Wie auch immer. Ich hoffe du verstehst was ich meine.

    Code:
    #include <fstream>
    #include "save.h"
    using namespace std;
    
    #define MAX 3
    static char *filename = "Adressen.html";
     
    bool Speichern(struct TListe *, int, char *);
    
    int main()
    {
     TListe Liste[MAX];
     int ListenPlatz;
    
     for(ListenPlatz = 0; ListenPlatz < MAX; ListenPlatz++)
     {
     cout << "Bitte geben Sie den " << ListenPlatz+1 << " Namen ein: ";
     cin >> Liste[ListenPlatz].ZuNamen;
     cout << "Und nun die Telefonnummer: ";
     cin >> Liste[ListenPlatz].TelefonNummer;
     }
    
     if(Speichern(Liste, ListenPlatz, filename))
     cout << "Liste wurde gespeichert!\n" << endl;
    
     cout << "---------------------" << endl;
     cout << "Liste wird ausgegeben" << endl;
     cout << "---------------------\n" << endl;
    
     for(int i=0; i < ListenPlatz; i++) 
     {
     cout << "\nMitgliedsnummer: " << i+1 << endl;
     cout << Liste[i].ZuNamen << " " << Liste[i].TelefonNummer << endl;
     } 
    
     return 0;
    }
    
    bool Speichern(struct TListe Liste[MAX], int ListenPlatz, char *filename)
    {
     ofstream outfile(filename, ios::out);
     if(!outfile)
     {
     cerr << "\nFehler beim Oeffnen der Datei " << filename << "!" << endl;
     return false;
     }
     if(!outfile.is_open())
     {
     cerr << "\nDatei ist bereits offen. " 
     << "Bitte schliessen Sie die Datei " << filename << "!\n" << endl;
     return false;
     }
     for(int i=0; i < ListenPlatz; i++)
     {
     if(!(outfile << Liste[i].ZuNamen << "<br>"
     << Liste[i].TelefonNummer << "<br>") )
     {
     cerr << "\nFehler beim Schreiben der Datei!" << endl;
     return false;
     }
     }
     outfile.close();
    
     return true;
    }
    und die save.h

    Code:
    #include <iostream>
    #include <string>
    
    struct TListe {
     std::string ZuNamen;
     int TelefonNummer;
    };
    Viel Glück damit... :]

    EDIT: Damn! Kein HTML...

    cu
     
  4. 16. Juli 2005
    Ws funktioniert danke ^^

    aber ich blick da nich mehr so ganz durch??
    FOlgende fragen^^ :


    1. TListe Liste[MAX]; //Was bedeutet das max???
    2. ofstream outfile(filename, ios: ut); // Was ist das ??? Das is mir völlig neu^^

    3. cerr // Is das sowas wie cout<<""; ???
    4. #define MAX 3
    static char *filename = "Adressen.html";



    5. outfile.close(); // Was ist das schon wieder??



    völlig verwirrt

    NoFuture
     
  5. 16. Juli 2005
    Schön das es funktioniert :] . Zum ersten. TListe Liste[MAX]; bedeutet oben nichts anderes wie TListe Liste[3];. Oben im Code wurde MAX mit #define MAX 3 definiert. Das bedeutet das überall im Code der Compiler für MAX die 3 einsetzt.

    Das ist deshalb besser, weil du damit oben einfach 3 durch 10 ersetzen kannst und dann mehr Leute in der Liste speichern kannst ohne überall im Code Zahlen ändern zu müssen. Natürlich wäre dynamisches Anlegen noch besser, aber ich nehme an das du mit C++ erst beginnst und das noch nicht kennst.

    ofstream outfile(filename, ios: ut); ofstrem ist aus der Stream Klasse und für das Lesen und Schreiben von Dateien zuständig. Du kannst auch ofstream myfile(...) schreiben. Das erzeugt das Objekt myfile. In der Klammer steht unser Dateiname (filename) und nicht zwingend notwendig die Art des Eröffnungsmodus also ios: ut.

    cerr ist im Prinzip das gleiche wie cout nur das es ungepuffert ist. Eignet sich deshalb speziell für Fehlermeldungen.

    static char *filename = "Adressen.html"; legt den Dateinamen fest. static deshalb weil es im Programm eine satische Lebensdauer haben soll. Es handelt sich um einen Pointer vom Typ char.

    outfile.close(); ruft den Filestream Konstruktor auf und schließt die Datei. Dies ist so in C++. fclose(*FILE) wird nur noch in C verwendet!

    Übrigens ist bei kleinen Programmen outfile.close(); nicht nötig, weil der Konstruktor nach Programmablauf automatisch die Dateien schließt!

    Hoffe die Unklarheiten sind beseitigt!

    cu
     
  6. 17. Juli 2005
    danke jetzt hat sich fast alles geklärt bis auf:

    warum eignet sich das ungepufferte cerr besser als
    cout für fehlermeldungen?? ?was bedeutet
    "ungepuffert" eigentlich??
     
  7. 17. Juli 2005
    Programme nehmen immer Kontakt mit dem Betriebssystem auf. Bei dieser Kommunikation schickt das Programm Daten an das OS. Damit nicht ständig Daten ausgetauscht werden, werden sie in Pakete geschnürt und Portionsweise gesendet. Ungepuffert bedeutet, das es zu keiner "Ladungsansammlung" kommt. Die Zeichen werden sofort ausgegeben und nicht erst im I/O angesammelt. Dies ist im Fehlerfall gut weil der Nutzer hier sofort über den Fehler informiert werden soll.

    cu
     
  8. 17. Juli 2005
    achso danke jetzt hab ich alles kapiert *g

    €dit

    Wie mache ich eine Abfrage in das Programm??
    Also damit damit dass programm abfragt ob schon
    ein Eintraf vorhanden ist und wenn ja dann nur am
    ende nen eintrag dazufügt.

    Hoffe das ist nicht zu kompliziert ......
     
  9. 17. Juli 2005
    Wie ich sehe lässt du nicht locker . Anscheinend brauchst du eine DOS Konsolen Telefonliste, in denen sich Namen und Nummer beliebig speichern lassen. Außerdem möchtest du die Möglichkeit haben die Datei wieder auszulesen usw.

    Bevor ich jetzt an dem oben genannten Code rummache, gebe ich dir ein DOS Programm welches dies alles und noch einiges mehr erfüllt. Denn es ist in der Tat kompliziert die Datei auszulesen und fortzuführen. Mit 2 Codezeilen ist da nichts gescheites zu machen .

    Ich habe zusätzlich in das Programm eine CLS(); Funktion integriert, da ich annehme du verwendest Windows.

    Du kannst den Code verändern wie du willst, das ist mir schnuppe. Ich hoffe du bist jetzt zufrieden .

    Viel Spass damit!

    {bild-down: http://hometown.aol.de/jefersoncole/telefonliste.jpg}


    Das volle Programm (Visual Studio Projektmappe - falls du dies nicht hast, erstelle ein Projekt und ziehe alle Sourcen rein. Die fertige EXE liegt auch bei!).

    cu
     
  10. 17. Juli 2005
    Visual Studio ist die große Microsoft Entwicklungsumgebung für Profi-Programmierer. Die derzeit brandneue Version ist Visual Studio 2005.NET. Die Beta Version ist sogar kostenlos unter http://lab.msdn.microsoft.com/vs2005/ zu haben. Musst dich aber vorher anmelden. Ich benutze die 2003.NET. 2002 ist auch noch gut. Das Programm kostet in der Professional Edition ca. 1000,00 €.

    cu
     
  11. 18. Juli 2005
    gibt es vllt noch nen Alternativen download??....
    weil ich will nicht unbedingt mit meinem Dummen
    Windows auf die Page von Microshit und mit meinem Linux
    kann ich nicht auf meiner Windows Partition speichern......
     
  12. 18. Juli 2005

    Die volle Entwicklungsumgebung ist auch als RAR gepacktes File noch sehr groß, ca. 1,8 GB . Deshalb kann ich es nicht uppen. Allerdings findest du in den Tauschbörsen (eMule, ed2k://|file|Microsoft%20Visual%20Studio%20.NET%202003%20Enterprise%20DVD.iso|3552428032|23EBCE2546F63500341F45BBAFB94541|/ ...) sicher das Programm.

    Die MS Entwicklungs IDE ist sehr groß und hat viele Features. Du wirst erst lernen müssen damit richtig umzugehen. Es gibt dazu unzählige Visual C++ Bücher. Das von mir geschriebene Programm "Telefonliste" kannst du auch einfach mit anderen Compilern, wie Dev C++ oder Borland komplieren. Wenn du die Console.h und myMakros.h enfernst und stattdessen die ANSI Steuerzeichen benutzt kannst du den Code auch auf Linux mit dem GCC kompilieren.

    Visual Studio ist also nicht notwendig und ein wenig Overkill für so kleine Programme .

    cu
     
  13. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.