Aus C in CSV Datei schreiben, Navigation



  • Hallo,

    ich habe ein Programm erstellt, das die Winkel von 0-355° und deren Sinus Cosinus und Tangens berechnet und als csv formatierte excel Datei speichert.

    Das Programm funktioniert, jedoch wird in der Datei, da ich spaltenweise vorgehe, die Zeile immer um eins erhöhrt und daher sind die Werte für Sinus, Kosinus und Tangens immer unterhalb der letzten Zeile für die vorherige Spalte.

    Ich weis, dass ich es durch zeilenweises Vorgehen ändern könnte, habe mich aber gefragt, ob man die Zeile nicht wieder nach oben setzen kann, wenn man in der 2ten Spalte arbeitet.

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <math.h>
    #define pi 3.14159265359
    void float2str(float,char *);
    
    int main()
    {
        int n;
        float winkel;
        char textarray[20];
    
        FILE *dateizeiger=fopen("C:/Users/Username/Informatik/Praktikum/mathetab.csv","w+");
        if(dateizeiger==0){printf("Fehler beim oeffnen der Datei! \n"); return 0;};
    
    	fprintf(dateizeiger,"Winkel;Sinus;Cosinus;Tangens \n");
    
        for(winkel=0;winkel<=355;winkel=winkel+5)
        {
            float2str(winkel,&textarray[0]);
            fprintf(dateizeiger,"%s\n",textarray);
        }
    
        for(winkel=0;winkel<=355;winkel=winkel+5)
        {
            float2str((sin(winkel)*180/pi),&textarray[0]);
            fprintf(dateizeiger,";%s\n",textarray);
        }
    
        for(winkel=0;winkel<=355;winkel=winkel+5)
        {
            float2str((cos(winkel)*180/pi),&textarray[0]);
            fprintf(dateizeiger,";;%s\n",textarray);
        }
    
        for(winkel=0;winkel<=355;winkel=winkel+5)
        {
            float2str((tan(winkel)*180/pi),&textarray[0]);
            fprintf(dateizeiger,";;;%s\n",textarray);
        }
    
        printf("Fertig!");
        getch();
        return 0;
    }
    
    void float2str(float zahl,char *textarrayzeiger)
    {
        sprintf(textarrayzeiger,"%.5f",zahl);
        while(*textarrayzeiger)
        {
            if(*textarrayzeiger == '.') *textarrayzeiger=',';
            textarrayzeiger++;
        }
    }
    

    Ausgabe Screenshot:

    http://www.bilder-upload.eu/show.php?file=91a9c8-1445279832.jpg


  • Mod

    Dateien haben keine Zeilen, Spalten oder sonst irgendeine Formatierung, sie sind einfach nur eine Abfolge von Zeichen. Daher: Nein, du kannst in einer bestehenden Datei nicht im Nachhinein Spalten (oder überhaupt irgendetwas) einfügen. Du wirst die Datei in einem Rutsch mit dem gewünschten Inhalt schreiben müssen.

    Du kannst theoretisch auch vorher bei dir im Programm den Inhalt der Datei spaltenweise "berechnen" und dann den Inhalt komplett raus schreiben. Beispielsweise, indem du ein großes 2D-Array von chars anlegst und dort hinein den gewünschten Inhalt schreibst, in der Reihenfolge, die dir am besten passt, und dann das fertige Array in die Datei schreibst. Aber diese Methode dürfte in diesem Fall wesentlich komplizierter sein als die direkte Methode, da das Schreiben in der richtigen Reihenfolge schließlich recht trivial ist:

    for(winkel=0;winkel<=355;winkel+=5)
    {
      fprintf(dateizeiger,"%.5f; %.5f; %.5f; %.5f;\n", winkel, sin(winkel), cos(winkel), tan(winkel));
    }
    


  • Ok, danke dir! Meine Vermutung war lediglich, dass es ähnlich der semikolon Formatierung für den Spaltensprung (csv) auch eine Formatierung für das springen in die erste Zeile gäbe aber das wäre wohl zu umfangreich.



  • Bedenke aber, dass die Winkelfunktionen der Standardlibrary mit Bogenmaß arbeiten.



  • DirkB schrieb:

    Bedenke aber, dass die Winkelfunktionen der Standardlibrary mit Bogenmaß arbeiten.

    *abgeändert im Eingangspost


  • Mod

    Pures Fett schrieb:

    Ok, danke dir! Meine Vermutung war lediglich, dass es ähnlich der semikolon Formatierung für den Spaltensprung (csv) auch eine Formatierung für das springen in die erste Zeile gäbe aber das wäre wohl zu umfangreich.

    Mag sein, dass es das gibt. Aber nicht beim einfachen CSV-Format. Du kannst ja mal die 2000 Seiten Dokumentation des Excel-eigenen Dateiformats durchlesen, ob es so etwas gibt :p



  • Pures Fett schrieb:

    DirkB schrieb:

    Bedenke aber, dass die Winkelfunktionen der Standardlibrary mit Bogenmaß arbeiten.

    *abgeändert im Eingangspost

    Pures Fett schrieb:

    float2str((sin(winkel)*180/pi),&textarray[0]);
    

    ... ist aber falsch!



  • ok habe das ganze nun abgeändert und fertig, danke für eure Ratschläge!

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <math.h>
    #define pi 3.14159265359
    void float2str(float,char *);
    
    int main()
    {
        int n;
        float winkel;
        char textarray[20];
    
        FILE *dateizeiger=fopen("C:/Users/Username/Informatik/Praktikum/mathetab.csv","w+");
        if(dateizeiger==NULL){printf("Fehler beim oeffnen der Datei! \n"); return 0;};
    
    	fprintf(dateizeiger,"Winkel;Sinus;Cosinus;Tangens \n");
    
    	/*for(winkel=0;winkel<=355;winkel+=5)
    	{
    		fprintf(dateizeiger,"%.0f;%.2f;%.2f;%.2f;\n", winkel, sin(winkel*pi/180), cos(winkel*pi/180), tan(winkel*pi/180));
    	}*/
    
    	for(winkel=0;winkel<=355;winkel+=5)
    	{
    		float2str(winkel, &textarray[0]);
    		fprintf(dateizeiger,"%s;", textarray);
    		float2str(sin(winkel*pi/180), &textarray[0]);
    		fprintf(dateizeiger,"%s;", textarray);
    		float2str(cos(winkel*pi/180), &textarray[0]);
    		fprintf(dateizeiger,"%s;", textarray);
    		float2str(tan(winkel*pi/180), &textarray[0]);
    		fprintf(dateizeiger,"%s\n", textarray);
    	}
    
        printf("Fertig!");
        getch();
        return 0;
    }
    
    void float2str(float zahl,char *textarrayzeiger)
    {
        sprintf(textarrayzeiger,"%.5f",zahl);
        while(*textarrayzeiger)
        {
            if(*textarrayzeiger == '.') *textarrayzeiger=',';
            textarrayzeiger++;
        }
    }
    

Log in to reply