Datei Einlesen und verändern



  • Hallo Leute. Ich versuche gerade eine Datei an einer bestimmte Stelle einzulesen, diese dann bisschen zu verändern und wieder abzuspeichern.
    Datei: test.csv
    Sieht so aus:

    ++++++++++++++++++++++++++++++++++++++++++
    Parameter:
    ++++++++++++++++++++++++++++++++++++++++++

    W-wert : 100.00
    I-wert : 0.015000
    K-wert : 0.000002
    Intervall - untere Grenze: 100.00
    Intervall - obere Grenze: 1000.00
    Schritte : 21
    ++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++++++++++++++++++++++++++++
    Parameter:
    ++++++++++++++++++++++++++++++++++++++++++

    +--------------------------------------------------------+
    |# F R I B P |
    +--------------------------------------------------------+
    |1. 100.0000 0.0129 0.1128 0.0129 83.4786 |
    |2. 145.0000 0.0274 0.1632 0.0274 80.4773 |
    |3. 190.0000 0.0476 0.2129 0.0476 77.4024 |
    |4. 235.0000 0.0739 0.2615 0.0739 74.2303 |
    |5. 280.0000 0.1067 0.3087 0.1067 70.9375 |
    +--------------------------------------------------------+

    Ich möchte eine Ausgabe haben, die so aussieht(nur den Teil verändern, der obere Teil soll weiterhin erhalten bleiben):
    +--------------------------------------------------------+
    |# F, R, I, B, P , |
    +--------------------------------------------------------+
    |1. 100.0000, 0.0129, 0.1128, 0.0129, 83.4786 |
    |2. 145.0000, 0.0274, 0.1632, 0.0274, 80.4773 |
    |3. 190.0000, 0.0476, 0.2129, 0.0476, 77.4024 |
    |4. 235.0000, 0.0739, 0.2615, 0.0739, 74.2303 |
    |5. 280.0000, 0.1067, 0.3087, 0.1067, 70.9375 |
    +--------------------------------------------------------+
    Also einfach an diesen Stellen ein Komma als Trennzeichen ergänzen. Ich glaube man sieht es hier nicht so gut, aber es soll eine Art Tabelle darstellen.
    Jeder Buchstabe (F,R,I,B,P) gehört zu einer Spalte.

    Code:

    int main(void)
    {
    	FILE *datei = NULL;	
            //liste(datei, ','); mit dem Trennzeichen "," aufrufen
    	liste(datei);
    
    	printf("\n\n");
    	return 0;
    }
    
    void liste(FILE *datei)//Hier Parameter hinzufügen: char zeichen
    {
    	int c = 0;
    	datei = fopen("test.csv", "r+");
    
    	if(datei != NULL)
    	{
    		while( (c=fgetc(datei)) != EOF )
    			putchar(c);
    	}
    	else
    		printf("\nKonnte nicht gefunden werden");
    
    	fclose(datei);
    }
    

    Leider wüsste ich nicht, wie ich an diese bestimmte Stelle komme und wie ich das komma dort reinschreien könnte. Es ist nicht notwendig, dass man auf der Konsole überhaupt was sieht. Was ich erreichn will ist nur, dass am Ende, wenn die Datei erstellt wurde, das vorhandene Überschrieben wird (also mit komma als Trennzeichen drin steht).

    Könnt ihr mir tips geben, wie man sowas realsieren kann?
    Gruß
    Manda



  • Hallo,
    das ist vermutlich einfacher als du denkst, öffne zwei Dateien: das Original zum Lesen (rfile), die Ausgabedatei mit den zusätzlichen Kommas unter einem anderen Namen, oder in einem anderen Verzeichnis zum Schreiben (wfile).

    Kopiere rfile nache wfile ( fgets, fputs ) solange bis das erste Zeichen eine Raute ist und die Zeile # F R I B P lautet.
    Schreibe # F, R, I, B, P in wfile (fputs, fprintf).
    Falls Leerzeilen folgen, ignoriere sie. Lies 5 Zeilen in einer Schleife ein und schreibe nach jeder der eingelesenen Zeile deine Kommas in wfile rein:

    int zeilen_nr;
    float F, R, I, B, P;
    // TODO: in eine Schleife einbauen, Rückgabewert von fscanf und fprintf
    // prüfen, ggf. Fehlerbehandlung.
    fscanf(rfile, "%d. %lf %lf %lf %lf %lf\n", &zeilen_nr, &F, &R, &I, &B, &P);
    fprintf(wfile, "%d. %lf, %lf, %lf, %lf, %lf\n", zeilen_nr, F, R, I, B, P);
    

    Das wars auch schon. Je nachdem, ob du das Original noch brauchst, kannst du es z.B. löschen und wfile in den Originalnamen umbenennen.

    Gruß,
    B.B.



  • P.S.
    Achso, der Datentyp stimmt noch nicht ganz mit den Formatstringargumenten überein, müsste double sein.



  • Hallo @BigBrother. Dein Tip hat mir geholfen. Nun stehe ich vor etwas anderem und komme da nicht weiter. Bin schon ziemlich lange dabei und verliere so langsam den Überblick (und die Geduld ;)). Ich würde gerne mal erklären was ich meine, dazu einpaar ausschnitte aus dem code:
    main wählt eigentlich nur die Funktionen aus.

    main()
    {
    ...
    switch(tolower(auswahl))
    		{
    		case 'a':
    				system("cls");
    				ausgabe(out, schwingkreis);
    			break;	
    		case 'b':
    				system("cls");
    				berechnen(out, schwingkreis);
    			break;
    		case 'c':
    				system("cls");
    				intervall(out, schwingkreis);
    			break;
    		case 'd':
    				system("cls");
    				liste(out, schwingkreis, ',');
    			break;
    		}
    ...
    }
    

    Dann gehts zur Ausgabe: dort werden die Werte nur gesetzt.

    void ausgabe(FILE *out, schwingkreis_t *schwingkreis)
    {
    	struct schwingkreis ptr;
    	schwingkreis = &ptr;
    
    	ptr.r			 = 100.00;
    	ptr.l			 = 0.01500000;
    	ptr.c			 = 0.00000180;
    	ptr.fmin	    = 100.00;
    	ptr.fmax		 = 1000.00;
    	ptr.schritte = 21;
    	out			 = stdout;
    
    	system("cls");
    	fprintf(out, "++++++++++++++++++++++++++++++++++++++++++");
    	fprintf(out, "\nSchwingkreisparameter:");
    	fprintf(out, "\n++++++++++++++++++++++++++++++++++++++++++");
    	fprintf(out, "\nWiderstandswert			 : %.2lf   Ohm", ptr.r);
    	fprintf(out, "\nInduktionswert			 : %lf H", ptr.l);
    	fprintf(out, "\nKapazitaetswert			 : %lf F", ptr.c);
    	fprintf(out, "\nFrequenzintervall - untere Grenze: %.2lf   Hz", ptr.fmin);
    	fprintf(out, "\nFrequenzintervall - obere  Grenze: %.2lf  Hz", ptr.fmax);
    	fprintf(out, "\nAnzahl der Schritte		 : %d", ptr.schritte);	
    	fprintf(out, "\n++++++++++++++++++++++++++++++++++++++++++");
    
    	getch();
    	menu(out, schwingkreis);		
    }
    

    Von hier wieder zurück ins main().
    So jetzt kommts, wenn ich jetzt aber "d" drücke, so dass er in die letzte Funktion springt und dort erst speichert.
    Dann verstehe ich nicht wie ich mit dem pointer des structs und dem filepointer, genau das abbild bekomme was ich in ausgabe() habe?

    Hier noch mein struct:

    struct schwingkreis
    {
    	double r;
    	double l;
    	double c;
    	double fmin;
    	double fmax;
    	int schritte;
    	double **ue_fkt;
    };
    

    Also mir ist nicht klar, wie ich die Datei dann erstellen sollte?

    void liste(FILE *datei, schwingkreis_t *schwingkreis, char tz)
    { 
      datei = fopen("schwingkreis.csv", "a");//a, weil noch was dazu kommen soll
      if(datei != NULL)
      {
         fprintf(datei, "%s", schwingkreis->r);
      }
      fclose(datei);
    }
    

    Wenn ich sowas in liste() versuche,d ann steht in der Datei folgendes: (null)
    Hoffe du kannst mir da nochmal helfen 🙂



  • Kein Wunder das Null drin steht, du speicherst in einen lokalen Speicherbereich der Funktion Ausgabe.
    Dieser Speicherbereich ist nur lokal in der Funktion Ausgabe gültig.

    Nun gibts da mehrere Möglichkeiten, die einfachste ist: anstelle von ptr.r = 100.00; schreibst du schwingkreis->r = 100.00; usw., in diesem Fall brauchst du die lokale Strukturvariable struct schwingkreis ptr nicht.

    Gruß,
    B.B.


Anmelden zum Antworten