Datein beschreiben



  • Ich möchte mit fputs meien Datei beschrieben. Das funktioniert auch. Aber irgendwie macht er danach jedes mal aufs neue einen Zeilenumbruch.
    Kann ich den irgendwie abstellen?
    LG

    fputs(adressen.vname, addresbuch);
    	fputs(adressen.nname, addresbuch);
    

  • Mod

    Code zeigen. fputs fügt jedenfalls, anders als puts, keine Zeilenumbrüche in die Ausgabe ein. Der Zeilenumbruch muss also anderswo herkommen. Wenn dies das gleiche Programm ist, wie in deinem anderen Thread, ist klar, wo er her kommt: Du hast die Namen mittels fgets gelesen, welches bis inklusive(!) eines Zeilenumbruchs liest.



  • Irgendwie bin ich jetzt etwas auf. Hab da jetzt so viel drin rumprobiert

    #include <stdio.h>
    #include <stdlib.h>
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    #define MAX 30
       FILE *addresbuch;
    struct adres {
       char vname[MAX];
       char nname[MAX];
       int plz;
       char ort[MAX];
       int geburtsjahr;
    } adressen;
    void eintragEingeben() {
     printf("Vorname      : ");
     scanf("%5ac",adressen.vname);
     fflush(stdin);
      printf("Nachname      : ");
      scanf("%5",adressen.nname);
     fflush(stdin);
    
     /*  printf("Postleitzahl : ");
       do {
          scanf("%5ld",&adressen.plz);
       } while(getchar()!= '\n');
       printf("Wohnort      : ");
       fgets(adressen.ort, MAX, stdin);
       printf("Geburtsjahr  : ");
       do {
          scanf("%4d",&adressen.geburtsjahr);
       } while(getchar()!='\n' );
    	*/
     fputs(adressen.vname, addresbuch); 
        fputs(adressen.nname, addresbuch);
    
    /*	fputs(adressen.plz, addresbuch);
    	fputs(adressen.ort, addresbuch);
    	fputs(adressen.geburtsjahr, addresbuch);
    */
    
    }
    void menue() {
        int a;
         printf("----- Addresbuch ---- \n");
         printf("----- Wählen Sie eine Funktion ---- \n");
        printf("1 -  Eintragen \n");
            printf("2 -  Eintrag ausgeben \n");
            printf("3 -  Eintrag modifizieren \n");
            printf("Auswahl:");
        scanf("%d", &a);
      fflush(stdin);
        switch (a) {
    
            case 1:
                 eintragEingeben();
    
                break;
    
        }
    
    }
    
    void erstelleDatei() {
    
        addresbuch = fopen("addresbuch.txt", "a+");
    
    }
    
    int main(int argc, char** argv) {
    
    	 erstelleDatei();
        menue();
        return 0;
    }
    


  • Damit geht es. Danke!

    #include <stdio.h>
    #include <stdlib.h>
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    #define MAX 30
       FILE *addresbuch;
    struct adres {
       char vname[MAX];
       char nname[MAX];
       int plz;
       char ort[MAX];
       int geburtsjahr;
    } adressen;
    void eintragEingeben() {
     printf("Vorname      : ");
     scanf("%s",adressen.vname);
     fflush(stdin);
      printf("Nachname      : ");
      scanf("%s",adressen.nname);
     fflush(stdin);
    
     /*  printf("Postleitzahl : ");
       do {
          scanf("%5ld",&adressen.plz);
       } while(getchar()!= '\n');
       printf("Wohnort      : ");
       fgets(adressen.ort, MAX, stdin);
       printf("Geburtsjahr  : ");
       do {
          scanf("%4d",&adressen.geburtsjahr);
       } while(getchar()!='\n' );
    	*/
     fputs(adressen.vname, addresbuch); 
        fputs(adressen.nname, addresbuch);
    
    /*	fputs(adressen.plz, addresbuch);
    	fputs(adressen.ort, addresbuch);
    	fputs(adressen.geburtsjahr, addresbuch);
    */
    
    }
    void menue() {
        int a;
         printf("----- Addresbuch ---- \n");
         printf("----- Wählen Sie eine Funktion ---- \n");
        printf("1 -  Eintragen \n");
            printf("2 -  Eintrag ausgeben \n");
            printf("3 -  Eintrag modifizieren \n");
            printf("Auswahl:");
        scanf("%d", &a);
      fflush(stdin);
        switch (a) {
    
            case 1:
                 eintragEingeben();
    
                break;
    
        }
    
    }
    
    void erstelleDatei() {
    
        addresbuch = fopen("addresbuch.txt", "a+");
    
    }
    
    int main(int argc, char** argv) {
    
    	 erstelleDatei();
        menue();
        return 0;
    }
    

  • Mod

    fflush(stdin) ist immer noch undefiniertes Verhalten. Postleitzahlen sind immer noch keine Zahlen. scanf("%s") führt keine Längenprüfung der Eingabe durch. Globale Variablen sind die Wurzel allen Übels. Deine Einrückung ist totaler Zufall.



  • SeppJ schrieb:

    fflush(stdin) ist immer noch undefiniertes Verhalten. Postleitzahlen sind immer noch keine Zahlen. scanf("%s") führt keine Längenprüfung der Eingabe durch. Globale Variablen sind die Wurzel allen Übels. Deine Einrückung ist totaler Zufall.

    Hi. Danke für deine Hilfe. Leider bin ich totaler Anfänger und verstehe nicht ganz, worauf du hinaus willst.
    Erst sagt du:"Achtung, das macht nicht, was du denkst. '\n' in scanf-Formatstrings überspringt beliebige Mengen Whitespace. "
    Dann ist fflush(stdin) undefiniert. Da verstehe ich jetzt nicht, was richtig sein soll
    Wieso sind PLZ keine Zahlen? Hierbei handelt es sich doch immer um eine 5 stellige Nummer? Du meinst, ich soll einen char[5] dafür nutzen?
    Bei %s immer eine 30 dahinter, zur Überprüfung?

    Das File benötige ich ja noch in anderen Methoden, später. daher sollte dies doch schon global sein.

    Vielen Dank und LG



  • BoosterBey schrieb:

    Erst sagt du:"Achtung, das macht nicht, was du denkst. '\n' in scanf-Formatstrings überspringt beliebige Mengen Whitespace. "

    Es überliest nicht nur '\n' sondern auch Leerzeichen.
    ES macht mehr als du vermutest.

    BoosterBey schrieb:

    Dann ist fflush(stdin) undefiniert. Da verstehe ich jetzt nicht, was richtig sein soll

    fflush(stdin) ist nicht richtig.

    BoosterBey schrieb:

    Wieso sind PLZ keine Zahlen? Hierbei handelt es sich doch immer um eine 5 stellige Nummer?

    1. Das gilt für Deutschland
    2. Hier sind es Ziffernfolgen.
    3. Führende Nullen werden bei Zahlen i.A. nicht mit angegeben.

    BoosterBey schrieb:

    Du meinst, ich soll einen char[5] dafür nutzen?

    Nein. Du kannst sie als Zeichenkette (String) behandeln. Aber da reicht 5 dann nicht.

    BoosterBey schrieb:

    Bei %s immer eine 30 dahinter, zur Überprüfung?

    Jein. Aber die 30 ist verkehrt

    BoosterBey schrieb:

    Das File benötige ich ja noch in anderen Methoden, später. daher sollte dies doch schon global sein.

    Nein, nicht global.
    Funktionen kann man Argumente übergeben. Das können dann auch die benötigeten Variablen sein.



  • BoosterBey schrieb:

    Dann ist fflush(stdin) undefiniert. Da verstehe ich jetzt nicht, was richtig sein soll

    undefiniert bedeutet, dass die leute, die den standard für die programmiersprache c entwickeln, es offen lassen, was fflush(stdin) macht.
    für den visual-c++-compiler bedeutet das, dass fflush(stdin) den eingabepuffer leert, für den gcc bedeutet das, dass da gar nix passiert (glaube ich jedenfalls) und der gleiche programmcode dann unterschiedliches verhalten zeigt bzw. das programm unter windows funktioniert und unter linux eben nicht.

    für andere compiler (openwatcom, borland usw.) ist das wieder anders, weils ja undefiniert ist, und deshalb sollte man eben auch immer die bedienungsanleitung des compilers zumindest mal schnell durchgelesen haben (viel spaß beim gcc, das ist ein roman von 854 seiten).

    also zum üben unter windows kannst du das sehr wohl machen, für linux gibt es zig ergebnisse, wenn du "linux fflush(stdin) geht nicht" in die suchmaschine eingibst und wenn du irgendwann mal professionelle programme schreibst, machst du das mit präprozessordirektiven.


Anmelden zum Antworten