Öffnen und Erzeugung einer Textdatei in C
-
Erst einmal vielen Dank. ich habe es eben versucht aber die Werte werden nicht aufgenommen, stattdessen entstehen andere Werte.
-
ich habe mich jetzt intensiv mit der ausgabe befasst und auch eine ASCII tabelle hinzugenommen. Mir fiel auf, dass die Werte stets einzeln eingelesen werden.
beim ersten wert zb einer 1 klappt es noch aber beim nächsten wert zb 324 klappt es nicht mehr. als ich int array zu einem char array umgeändert habe wurde plötzlich die kommas mit eingelesen.
-
habe nun etwas weiter dran gearbeitet und konnte es schaffen, dass die kommas weggelassen werden. Aber mein Problem, dass nur einzelne Zahlenwerte eingelesen werden bleibt weiterhin bestehen.
unsigned char daten[200]; int anzahl_daten=0; while (1 == fscanf(vorgabe,"%c",&daten[anzahl_daten]) && 1) {//die letzte 1 durch Test auf Arrayüberlauf ersetzen if(daten[anzahl_daten]==44){ daten[anzahl_daten]=0; anzahl_daten--; }else { anzahl_daten++; } }
-
Du willst Zahlen einlesen, keine Ziffern!
128 ist eine Zahl aus den Ziffern '1' und '2' und '8'Die Zahl 128 hat auch den Wert 128. Während '1' ein Zeichen ist und einen anderen Wert hat (bei ASCII ist das 49)
Mit den Ziffern alleine lässt sich nicht so einfach rechnen.
Darum bietet dirscanf
die Möglichkeit gleich Zahlen einzulesen.
Dabei werden führende Leerzeichen (Whitespace) sogar überlesen und die Eingabe endet beim ersten Zeichen, dass nicht mehr zur Zahl passt (Whitespace, Buchstaben, Sonderzeichen, ...).Bis auf Whitespace müssen diese Zeichen aus der Eingabe entfernt werden, wenn du wieder eine Zahl lesen möchtest.
Darum ist das ohne Komma so viel einfacher.Wenn du das verstanden hast, kannst du dich um das Komma kümmern.
scanf
ist eine mächtige Funktion und man muß wissen, welche Bedeutung die Zeichen im Formatstring haben.
Schließe nicht vonprintf
aufscanf
-
ich hab mir nun näher angeschaut und habe meine Strategie nun nochmal geändert und kam zum Entschluss, dass ich die werte in der Textdatei in einem string-array abspeichern möchte und die Funktion strtok verwenden möchte die es mir erlaubt ausgewählte Zeichen zu unterbinden.
Ich habe es geschafft dass die Tabelle erstellt wird mit den zahlen, jedoch kann ich nun nicht den Mittelwert bilden da es sich um einzelne Zeichenketten handelt und die Berechnung durch 2 mir nicht korrekte Zahlenwerte ausgibt. Gibt es eine Möglichkeit dies zu beheben ? Außerdem wird mir der erste Wert in der Tabelle als (null) eingetragen, wieso ?#include <stdio.h> #include <stdlib.h> #include <string.h> int main () { int x; int i; int j; FILE *vorgabe; FILE *tabelle; char delimiter[] = ","; char *ptr; // Datei oeffnen vorgabe = fopen("werte.txt", "r"); if(vorgabe == NULL) { printf("\n\nDie Datei konnte NICHT geoeffnet werden.\n"); }else { printf("\n\nDie Datei konnte geoeffnet werden.\n\n\n"); } //Zahlen aus Textdatei einlesen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! char string[200]; int daten[200]; int anzahl_daten=0; ptr = strtok(string, delimiter); while (1 == fscanf(vorgabe,"%s",&string[anzahl_daten]) && 1) {//die letzte 1 durch Test auf Arrayüberlauf ersetzen /* if(daten[anzahl_daten]==44){ daten[anzahl_daten]=0; anzahl_daten--; }else { */ anzahl_daten++; } //} i=0; while(ptr != NULL) { printf("Abschnitt gefunden: %s\n", ptr); // naechsten Abschnitt erstellen ptr = strtok(NULL, delimiter); daten[i]=ptr; ++i; } //EINLESEN ENDE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //Datei schreiben und befüllen mit fprintf tabelle = fopen("mittelwerte_M_N.txt","w"); fprintf(tabelle, "Messzeitpunkt\tMesswert\tMittelwert\tStatus\n\n"); //befüllung der Textdatei mit den Werten for(i=0;i<37;i++) { double MW= ((double)daten[i]/2); fprintf(tabelle,"%d\t\t%s\t\t%.2lf\t\t%d\n",i,daten[i],MW ,i); } printf("Die Tabelle mit den erzeugten Dateien wurde erfolgreich erstellt.\n\n"); // Datei schliessen fclose(vorgabe); fclose(tabelle); return 0; }
-
Das ist Schrott.
Du hast C-Strings und
fscanf
nicht begriffen.Warum brauchst du ein String-Array? (Hast du auch nicht, du hast ein char-Array)
Du willst doch mit Zahlenwerten arbeiten.Was macht die
fscanf
-Zeile? Welche Bedeutung haben die Parameter?
Wie oft wird das anzahl_daten++; ausgeführt und welche Auswirkung hat das?
-
anzahl_daten wird so lange um 1 erhöht bis alle zahlen aus der textdatei durchlaufen sind.
und ja ich verwende einen char array in dem ich die zahlen als zeichen abspeicher dies ermöglicht mir problemlos diese in meiner zu erstellenden Datei einzutragen.
-
In einem char-Array kannst mehrere Zeichen (zusammen) abspeichern.
Eine Zahl besteht aus mehreren Ziffern/Zeichen.
Für eine Zahl brauchst du als schon ein char-Array alleine.
Du versuchst aber eine komplette Zahl/(Teil-)Zeile in einem Zeichen unterzubringen.Bei %s liest
fscanf
bis zu einem Whitespace oder Dateiende.
Möglicherweise auch die ganze Zeile und nicht nur eine Zahl.Annahme:
In der Datei steht 11,18,12,15, 9,33
Dann steht in String 19,33
Dabei ist die 1 von der 11 und die 9,33 vom der zweiten Hälfte.
-
wie kann ich am besten dagegen angehen um diese fehlerhafte Abspeicherung zu unterbinden ?
-
Du musst begreifen, wie
scanf
funktioniert.
Geht (IMHO) einfacher ohne Komma.²Dann weißt du auch, wie du den Formatstring ändern kannst, damit er das Komma überliest
Dazu muss man aber die Referenz zuscanf
verstehen.
http://www.cplusplus.com/reference/cstdio/scanf/
http://en.cppreference.com/w/c/io/fscanfBeispiele habe ich genannt.
-
Vielen dank! Konnte mein Problem beheben nun funktioniert alles so wie es sein sollte.
-
Auch mit Leerzeichen vor und/oder nach den Kommas?
-
darauf hab ich jetzt nicht geachtet aber das war nicht in der Aufgabenstellung gefragt und selbst die zahlen in der Textdatei folgen direkt nach den Kommas. mir wird alles so ausgegeben so wie ich es mir vorgestellt habe.