Heftiges Programm?



  • fprintf



  • void speichern(void) {
        FILE *save = fopen("noten.dat","w+b");
    
        if( NULL == save ) {                  // (1)
            save = fopen("noten.dat","w+b");  // (2)
            if( NULL == save ) {              // (3)
                fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n");
            }                                 // (4)
        }
    
        //...
    }
    

    Wieso versuchst du wenn das öffnen der Datei fehlschlägt (1) nochmals die datei zu öffnen (2) und prüfst nochmals (3)? Außerdem müsstest du die Funktion bei (4) mit return verlassen.

    also:

    void speichern(void) {
        FILE *save = fopen("noten.dat","w+b");
    
        if( !save ) {
            fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n");
            return;
        }
    
        //...
    }
    

    Greetz, Swordfish



  • oh, hab ich garnicht bemert! danke für den tipp, habs mal geändert.
    wie benutze ich denn jetzt fprinf um n[i] in sie zu schreiben?

    ich habe mir gedacht, dass es evtl. auch einfach nur daran liegen kann, dass ich ja einen eindimensionalen array genommen habe. bei dem steht ja alles hintereinender... wenn ihc jetzt aber einen mehrdimensionalen benutzen würde, der 1 spalte, aber 13 zeilen hat, müsste das doch klappen, oder?

    *edit*

    habe das gerade mal ausprobiert, bringt aber garnix. ich denke mal, dass ich dann wohl doch auf fprintf zurückgreifen muss.
    aso, hier mal ein screenshot von dem, was in meiner datei gespeichert wird:

    [img] http://www.bilder-hochladen.net/files/6ue-q.jpg [/img]

    das sollten eigentlich zahlen sein ?!?





  • ok, ich habe es mittlerweile geschafft, dass ich in der datei "noten.dat" richtige zahlen speichere. allerdings stehen die immernoch in einer zeile und haben anstatt leerzeilen ein kästchen dazwischen. Ich habe mittlerweile festgestellt, dass das kästchen für mein "\n" gebildet wird. nur, wenn ihc in eine neue Zeile gehen will, wie kann ich das denn sonst machen, ausser mit \n ????

    for ( i=0; i<12;i++) {
    	fprintf(save, "%i\n", n[i][1]); 
    	}
    

    desweiteren werden meine Werte jetzt nichtmehr eingelesen? ich denke, dass ich auch dafür den befehl dann verändern muss, oder?

    *EDIT*

    habe den 2. Teil schon gelöst, bleibt nurnoch die Farge nach den Zeilen 🙂



  • probier mal \r\n oder oeffne die datei als "r" statt "rb"



  • SUper, danke!!! mit \r\n klappt alles. aber, wofür steht da das \r ? im internet finde ich nix dazu ?!



  • \r\n auch bekannt als CR-LF steht fuer carriage return, line feed.

    unix-gebraeuchlich reicht ein \n fuer das was du willst.
    richtiger ist aber \r\n, weil ein \n eigentlich nur in die naechste zeile springt, aber der cursor nicht wieder an den anfang geht. kannst du bei ner telnet session beobachten/ausprobieren, wenn du dir schon mal sockets angeguckt hast.

    dein notepad (nimm einen anderen editor oder gleich hex editor bitte) versteht \n allein nicht und zeigt dreck an.



  • ah, ok, dann ist das natürlich einleuchtend, warum das so nicht klappen wollte. hat zwar ne neue zeile gemacht, aber trotzdem in der alten weitergeschrieben.

    Vielen, vielen Dank, du hast mir wirklich super geholfen!!!!!!
    Jetzt muss ich das programm erstmal koomplett durcharbeiten und verdauen, aber ich denke, für nen totalen einsteiger ist das doch schon ganz gut 🙂

    hier nochmal der komplette code, falls sich irgendwer für interessiert 🙂

    #include <stdio.h>
    int i,e,a;
    int n[13];
    
    void speichern(void) {
            FILE *save = fopen("noten.dat","w+b");
    
    		if( !save ){
                fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n");
    			return;
                }
    
    		for (i=0; i<=13; i++)
    			{
    		fprintf(save, "%i\r\n", n[i]);
    
    			}
    
    	fclose(save);
    
    }
    void ausgabe(void) {
            FILE *output = fopen("noten.dat","r+b");
            if( NULL == output ) {
                fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n");
        }
    	for (i=0; i<=13; i++)
    		{
        fscanf(output,"%i ",&n[i]);
    		}
    
    	/*for(i = 0; i <= 13; ++i)
    		{
    		printf("%.1f..: %i\n", 1.0 + i/3.0, n[i][1]);				//bei interesse einfach wieder eingliedern...
    		}*/
    	printf("\n\nHistogramm:\n\n");
    	printf("|");
    		for (i=0; i<=13; i++) {
    			if (n[i]>=20)
    				printf(" %i",n[i]);
    			else
    				printf("   ");
    		}
    	printf("\n");
    	for (a=19; a!= 0; --a)
    	{
    		printf("|");
    		for (i=0; i<=13 ; i++) {
                 if (n[i]>=a)
                    printf("  *");
                 else
                	printf("   ");
    	}
    	printf("\n");
    	}
        printf("|--+--+--+--+--+--+--+--+--+--+--+--+--+\n");
        printf("   0  1  2  3  4  5  6  7  8  9  10 11 12\n\n\n");
    
        fclose(output);
    }
    void eingabe(void) {
    	for(i = 0; i < 13; ++i)
    		do
    		{
        		printf("%.1f..:" , 1.0 + i/3.0);
    			scanf("%i", &e);
    			n[i] = e;
    		}
    		while (i>=13);
            printf("\n Eingabe gespeichert! \n\n");
            speichern();
    
        }
        int main (void) {
            int wahl;
            do {
                printf("Was wollen sie machen:\n\n");
                printf("-1- Neue Datensaetze eingeben\n");
                printf("-2- Datensaetze im Histogramm ausgeben\n");
                printf("-3- Programm beenden\n\n");
                printf("Wahl: ");
                do {
                    scanf("%d", &wahl);
                } while(getchar() != '\n');
                switch(wahl) {
                    case 1 : eingabe();        break;
                    case 2 : ausgabe();        break;
                    case 3 : printf("...Programm wird beendet\n");
                            break;
                    default: printf(">> %d << ???\n",wahl);
                }
            }while(wahl != 3);
            return 0;
    }
    


  • int i, a, e; // würd ich nicht global lassen
    
    // ...
    
    void ausgabe(void) {
        FILE *output = fopen( "noten.dat", "r+b" );
        if( !output ) {
            fprintf( stderr, "Kann \"noten.dat\" nicht öffnen!\n" );
            // hier würd' ich and einer statt abbrechen:
            return;
        }
    

    So, jetzt musst dir nur noch einen eindeutigen Bracing-Style zulegen, richtig "intenden" und schon hast du fertig. Meine Gratulation

    Greetz, Swordfish



  • Swordfish schrieb:

    So, jetzt musst dir nur noch einen eindeutigen Bracing-Style zulegen, richtig "intenden" und schon hast du fertig. Meine Gratulation

    Greetz, Swordfish

    lol, bitte was? o.O
    ok, das mit dem return ist keine schlechte idee, muss ich wohl einfach vergessen haben ?. aber was bedeutet das andere?!?



  • Bracing-Style: Du sollst dir einen Stil zulegen, wie du die geschweiften Klammern anordnest, und den konsequent durchziehen.

    Indentation: Zu deutsch Einrückung.

    Beides ist bei dir noch Kraut und Rüben 😉



  • aaah! ok, ja, das feintuning wollte ich eh noch machen, hab ja noch fast 4 wochen Zeit mit der abgabe, lol 🙂
    mal gucken, wenn ich's überarbeitet habe, poste ich's nochmal, dann könnt ihr mir mal sagen, was ihr davon haltet . thxthxthx!!!



  • so, mal gucken, ob ich jetzt richtig "intended" hab ^^

    #include <stdio.h>												//Standard-Input-Output Funktion
    int i,e,a;														//Dekalrieren der Variablen
    int n[13];														//Deklariern des Eindimensionalen Arrays fuer die Noten
    int wahl;														//Deklarieren der Variablen "Wahl"
    
    void speichern(void)										//Unterfunktion Speichern
    	{
    	FILE *save = fopen("noten.dat","w+b");						//Datei "noten.dat" oeffnen und ueberschreiben
    	if( !save )													//wenn dies nicht möglich ist
    		{
    		fprintf(stderr,"Kann \"noten.dat\" nicht oeffnen!\n");	//gebe dies aus
    		return;													//und gehe wieder zum anfang zurueck
    		}
    
    	for (i=0; i<=13; i++)										//ansonsten nehme i und arbeite damit den array durch
    		{														//i steht fuer je eine Zahl im array
    		fprintf(save, "%i\r\n", n[i]);							//und schreibe das zeilenweise in die datei
    		}
    
    	fclose(save);												//schliesse Datei
    	}
    
    void ausgabe(void)											//Unterfunktion Ausgabe
    	{
    	FILE *output = fopen("noten.dat","r+b");					//oeffne Datei "noten.dat" mit leseberechtigung
    	if	( NULL == output )										//falls nicht vorhanden
    		{
    		fprintf(stderr,"Kann \"noten.dat\" nicht oeffnen!\n");	//gebe das aus
    		return;													//und gehe zum anfang zurueck
    		}
    	for (i=0; i<=13; i++)
    		{
    		fscanf(output,"%i ",&n[i]);								//lese die zahlen aus der datei zeilenweise
    		}														//und ordne sie in das array ein
    			printf("\n\nHistogramm:\n\n");						//gebe die ueberschrift aus
    
    	printf("|");												//und dann in der ersten zeile Zeile:
    	for (i=0; i<=13; i++)										//ueberpruefe jede zahl, ob diese groesser oder
    	{															//gleich 20 ist und gebe dann entweder die komplette
    		if (n[i]>=20)											//Zahl
    			printf(" %i",n[i]);
    		else
    			printf("   ");										//oder eine Leerzeile aus
    	}
    	printf("\n");												//wechsele in die naechste zeile
    
    	for (a=19; a!= 0; --a)										//beginne un in der 19. Zeile und arbeite dich nach unten
    		{
    		printf("|");											//jeweils am anfang ein |
    		for (i=0; i<=13 ; i++)									//arbeite den array durch
    			{
    			if (n[i]>=a)										//und gebe wenn benoetigt ein sternchen
    				printf("  *");
    			else
    				printf("   ");									//oder eine leerzeile aus
    			}
    		printf("\n");											//und wechsele dann in die naechste Zeile
    	}
    	printf("|--+--+--+--+--+--+--+--+--+--+--+--+--+\n"); 		//x-Achse des Histogramms
    	printf("   0  1  2  3  4  5  6  7  8  9  10 11 12\n\n\n");	//und die Beschriftung
    	fclose(output);												//Schliesse nun die Datei wieder
    	}
    
    void eingabe(void)											//Unterfunktion Eingabe
    	{
    	for(i = 0; i < 13; ++i)										//arbeite dich wieder durch das array
    		do
    			{
    			printf("%.1f..:" , 1.0 + i/3.0);					//Beginne bei Note 1.0 und addiere immer i/3.0
    			scanf("%i", &e);									//lese Die Zahl ein
    			n[i] = e;											//und fuege sie dem array zu
    			}
    		while (i>=13);											//solange bis i>=13 ist
    		printf("\n Eingabe gespeichert! \n\n");					//Gebe aus:
    	speichern();												//fuehre nun die speichern-Funktion durch
    	}
    
    int main (void)												//Hauptmenue
    	{
    	do
    		{
    		printf("Was wollen sie machen:\n\n");					// ausgabe des Hauptmenues
    		printf("-1- Neue Datensaetze eingeben\n");
    		printf("-2- Datensaetze im Histogramm ausgeben\n");
    		printf("-3- Programm beenden\n\n");
    		printf("Wahl: ");										//ausgabe der eingabeaufforderung
    		do
    			{
    			scanf("%d", &wahl);									//lese die Eingabe ein und
    			}													//ordne sie der Variablen "wahl" zu
    		while(getchar() != '\n');								//bis zum letzten eingabeteil
    
    		switch(wahl)											//"wahl-Funktion"
    			{
    			case 1 : eingabe();									//Bei 1 fuehre Funktion "eingabe" aus
    			break;
    
    			case 2 : ausgabe();									//Bei 2 fuehre Funktion "ausgabe" durch
    			break;
    
    			case 3 : printf("...Programm wird beendet\n");		//bei 3 gebe aus, dass das programm beendet wird
    			break;
    
    			default: printf(">> %d << ???\n",wahl);				//bei fehleingabe gebe dies aus
    			}
    		}
    	while(wahl != 3);											//solange wahl ungleich 3 ist
    	return 0;													//ruecklieferungswert
    	}
    


  • abgesehen von meiner persoenlichen abneigung zu diesem stil hast du eine inkonsistenz drin, naemlich beim for-loop nach dem printf("|").

    ein array[13] geht von [0] bis [12]. du benutzt aber [13]...



  • Jaaaaa! Sieht nett aus 😉

    Bracing Styles, just FYI:

    • Kernighan & Ritchie Style

    AKA: 1TBS (One True Brace Style), Kernel Style
    Tab-Size: C: 8, C++/Java: 4

    if( condition ) {
            code( );
    }
    
    • Allman Style

    AKA: BSD Style
    benannt nach Eric Allman, einem Berkeley-Hacker der viele BSD Utilities damit geschrieben hat.
    Tab-Size: C: 8, C++/Java: 4 oder 3

    if( condition )
    {
            code( );
    }
    
    • Whitesmiths Style

    Bekanntgeworden durch Beispiele, welche dem Whitesmiths C - Compiler beilagen.
    Tab-Size: 8, selten 4

    if( condition )
            {
            code( );
            }
    
    • GNU Style

    Benutzt im GNU EMACS und in der FSF (Free Software Foundation) und nirgendwo anders.
    Tab-Size: 4

    if( condition )
      {
        code( );
      }
    

    Die am meisten benutzten sind wohl Allan und Whitesmiths.

    Greetz, Swordfish



  • http://en.wikipedia.org/wiki/One_True_Brace_Style

    ich wuerde whitesmith nicht als "oftbenutzt" bezeichnen. seh den kaum in der wildnis. ich find den aber auch nicht zumutbar.

    ich seh aber sehr oft allman unter den C-lern und k&r unter den PHPlern.



  • ich finde den k+r style absolut ätzend 😡
    immer wenn ich fremden code sehe, der so geschrieben ist, muss ich den umformatieren. sonst blicke ich da nicht durch...



  • @c.crackwitz: ich seh' bei PHP'lern oft _garkeinen_ Stil 😃
    @net: was findest du an k&r so ätzend!? Aber, moment mal, das würd ja heißen du blickst bei meimem Code nicht durch... :p

    Greetz, Swordfish


Anmelden zum Antworten