Zahlenreihe mit csv in excel speichern



  • Hallo Forum,

    ich habe die Aufgabe, die Zahlen von 1.0 bis 5.0 in eine excel tabelle (.csv) zu speichern und folgendes Programm dazu geschrieben:

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    
    int main()
    {
    	int u;
    	float i;
    	char zeichenkette[50];								 
    
    	FILE *dateizeiger=fopen("C:/Users/Christian/Desktop/Mappe1.csv", "w");
    	if (dateizeiger==0){ printf("Datei konnte nicht geoeffnet werden!"); return 0;}
    
    	fprintf(dateizeiger,"%i;%i;%i;%i;%i \n",1,2,3,4,5);    //um in .csv Datei zu schreiben einfach ; für Spaltentrennung und , statt . für Komma und \n für neue Zeile
    
    	for(i=0.0;i<=5.0;i=i+0.5)
    	{
    		sprintf(zeichenkette,"%f;",i);                      //schreibt in zeichenkette die zahl i mit float-formatierung rein
    	}
    
    	for(u=0;u<50;u++)
    	{
    	    if(zeichenkette[u]=='.') zeichenkette[u]=',';	  //ersetzen der . kommas durch , kommas im ganzen array
    	}
    
    	fprintf(dateizeiger,"%s",zeichenkette);
    
    	fclose(dateizeiger);
    
    	getch();
    	return 0;
    }
    

    Die erste Reihe, wo nur 1,2,3,4,5 geschrieben werden funktioniert, bei der zweiten kommt immer nur die letzte Zahl aus der For-Schleife also hier 5, die anderen sind nicht drinnen. An welcher Stelle ist denn der Fehler?

    Bei sprintf wird ja immer im array (also zeichenkette) um eins weiter gegangen, richtig?

    Der Fehler muss wohl entweder bei der sprintf funktion oder bei der ausgabe am schluss mit fprintf sein 😕



  • Pures Fett schrieb:

    Bei sprintf wird ja immer im array (also zeichenkette) um eins weiter gegangen, richtig?

    Natürlich nicht.
    Wo hast du gelernt, dass das so ist?



  • Wutz schrieb:

    Pures Fett schrieb:

    Bei sprintf wird ja immer im array (also zeichenkette) um eins weiter gegangen, richtig?

    Natürlich nicht.
    Wo hast du gelernt, dass das so ist?

    ah ok, dann schreibt er es also wohl nur an die adresse 0 und daher halt die letzte Zahl

    aber mit sprintf kann man ja keinen pointer angeben oder?

    also

    sprintf(zeichenkette[0],"%f;",i);
    

    würde nicht funktionieren, da die Funktion sprintf das nicht als Argument akzeptiert. Muss ich nun eine andere Funktion verwenden?



  • sprintf gibt die Anzahl der geschriebenen Zeichen zurück.

    u = 0;
        for(i=0.0;i<=5.0;i=i+0.5)
        {
          u += sprintf(zeichenkette+u,"%f;",i);                      //schreibt in zeichenkette die zahl i mit float-formatierung rein
        }
    

    Nebenbei ist i ein ziemlich unüblicher Variablenname für ein float .

    Du brauchst auch nicht das ganze Array zu durchsuchen, sondern nur bis zum Ende der Zeichenkette.



  • Pures Fett schrieb:

    ah ok, dann schreibt er es also wohl nur an die adresse 0 und daher halt die letzte Zahl

    Nicht an die Adresse 0. Das wäre NULL und kommt nicht sehr gut.

    Pures Fett schrieb:

    aber mit sprintf kann man ja keinen pointer angeben oder?

    was denn sonst?
    zeichenkette ist hier die Anfangsadresse vom Array.

    Pures Fett schrieb:

    also

    sprintf(zeichenkette[0],"%f;",i);
    

    würde nicht funktionieren, da die Funktion sprintf das nicht als Argument akzeptiert. Muss ich nun eine andere Funktion verwenden?

    Du musst eine Adresse angeben. Dies kannst du mit dem Adressoperator & oder durch Zeigerarithmetik schaffen.
    &zeichenkette[0] ist das Gleiche wie zeichenkette+0



  • DirkB schrieb:

    Pures Fett schrieb:

    also

    sprintf(zeichenkette[0],"%f;",i);
    

    würde nicht funktionieren, da die Funktion sprintf das nicht als Argument akzeptiert. Muss ich nun eine andere Funktion verwenden?

    Du musst eine Adresse angeben. Dies kannst du mit dem Adressoperator & oder durch Zeigerarithmetik schaffen.
    &zeichenkette[0] ist das Gleiche wie zeichenkette+0

    ok danke, das durchzählen des arrays funktioniert nun, jedoch wird 0 0 1 1 2 2 3 3 4 4 5 5 hineingeschrieben statt die richtigen kommazahlen also 0.0 0.5 1.0 etc

    for(i=0.0;i<=5.0;i=i+0.5)
    	{
    		sprintf(&zeichenkette[u],"%f",i);                      //schreibt in zeichenkette die zahl i mit float-formatierung rein
    		u++;
    		sprintf(&zeichenkette[u],";");
    		u++;
    	}
    
    	for(u=0;u<50;u++)
    	{
    	    if(zeichenkette[u]=='.') zeichenkette[u]=',';	  //ersetzen der . kommas durch , kommas im ganzen array
    	}
    

    beim sprintf Befehl das Argument "Format", ist das falsch mit %f? denn die erste float zahl wäre ja zb 0.0, das kann er ja nicht als Wert in ein Char array speichern, da er den nachkommateil abschneidet.

    bei der Musterlösung wird es aber so wie ich das sehe auch so gemacht 😕



  • Dein Code hat mit meinem Beispiel (von 17:28:47 10.10.2015) fasst nichts gemeinsam.

    Pures Fett schrieb:

    beim sprintf Befehl das Argument "Format", ist das falsch mit %f? denn die erste float zahl wäre ja zb 0.0, das kann er ja nicht als Wert in ein Char array speichern, da er den nachkommateil abschneidet.

    Der Formatspecifier ist schon richtig.
    Und in ein char-Array passt das (wenn es groß genug ist) auch rein.

    Du läßt aber nur ein Zeichen dafür frei und das ist doch arg wenig.



  • DirkB schrieb:

    Dein Code hat mit meinem Beispiel (von 17:28:47 10.10.2015) fasst nichts gemeinsam.

    Pures Fett schrieb:

    beim sprintf Befehl das Argument "Format", ist das falsch mit %f? denn die erste float zahl wäre ja zb 0.0, das kann er ja nicht als Wert in ein Char array speichern, da er den nachkommateil abschneidet.

    Der Formatspecifier ist schon richtig.
    Und in ein char-Array passt das (wenn es groß genug ist) auch rein.

    Du läßt aber nur ein Zeichen dafür frei und das ist doch arg wenig.

    du sprichst in rätseln :p aber nun habe ich es verstanden und geschafft, vielen dank dir und allen anderen!



  • Pures Fett schrieb:

    du sprichst in rätseln :p aber nun habe ich es verstanden und geschafft, vielen dank dir und allen anderen!

    Rätsel oder verstanden?

    Dann zeig deine paar Zeilen.



  • hallo, hier nochmal das fertige Programm

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    
    int main()
    {
    	int u=0;
    	float i;
    	char zeichenkette[50];								 
    	FILE *dateizeiger=fopen("C:/Users/Christian/Desktop/Mappe1.csv", "w");
    	if (dateizeiger==0){ printf("Datei konnte nicht geoeffnet werden!"); return 0;}
    
    	fprintf(dateizeiger,"%i;%i;%i;%i;%i \n",1,2,3,4,5);    //um in .csv Datei zu schreiben einfach ; für Spaltentrennung und , statt . für Komma und \n für neue Zeile
    
    	for(i=0.0;i<=5.0;i=i+0.5)
    	{
    		sprintf(&zeichenkette[u],"%f",i);                      //schreibt in zeichenkette die zahl i mit float-formatierung rein
    		u=u+3;
    		sprintf(&zeichenkette[u],";");
    		u++;
    	}
    
    	for(u=0;u<50;u++)
    	{
    	    if(zeichenkette[u]=='.') zeichenkette[u]=',';	  //ersetzen der . kommas durch , kommas im ganzen array
    	}
    
    	fprintf(dateizeiger,"%s",zeichenkette);
    
    	fclose(dateizeiger);
    
    	getch();
    	return 0;
    }
    

    also im letzten Schritt nur die Zählvariable u um 3 erhöht, damit einstellige zahl und deren komma punkt und nachkomma wert reinpassen, bei mehrstelligen muss man dann weiter anpassen



  • Pures Fett schrieb:

    also im letzten Schritt nur die Zählvariable u um 3 erhöht, damit einstellige zahl und deren komma punkt und nachkomma wert reinpassen, bei mehrstelligen muss man dann weiter anpassen

    Was gefällt dir denn an

    u += sprintf(zeichenkette+u,"%f;",i);
    

    nicht?

    Wenn du weniger Nachkommastellen willst, musst du den Formatspecifier anpassen.



  • DirkB schrieb:

    Was gefällt dir denn an

    u += sprintf(zeichenkette+u,"%f;",i);
    

    nicht?

    oh stimmt, das wäre besser, da es sich auch bei mehrstelligen Zahlen anpasst, ich hatte den return-value von sprintf nicht im Kopf, da ich diese Funktionen bisher lediglich als Anweisungen benutzt habe.



  • Mmmm ....,
    das stand aber so in meiner ersten Antwort 🙄


Log in to reply