Öffnen und Erzeugung einer Textdatei in C
-
Wenn du die Werte einzeln verarbeitest, brauchst du kein Array.
Du kannst einen Wert einlesen, verarbeiten und ausgeben.
Das in einer Schleife, bis alle Daten gelesen sind.Du kannst deine Vorgabedatei erstmal ohne Komma (nur Leerzeichen als Trenner) abspeichern.
Das macht das am Anfang leichter.
-
das problem ist, dass es die bedingung der aufgabe ist die werte genau so auszulesen
-
Schritt für Schritt.
Die Erweiterung um das Komma zu überlesen, kannst du dann immer noch einbauen, wenn du weißt, dass der Rest funktioniert.
-
ich versuche mich ganze zeit dran aber schaffe es nicht. ich bekomme die werte die ich lese nicht in einem array. ich wollte es mit einem array machen da es direkt übersichtlicher ist meiner meinung nach für die ausgabe und fürs rechnen
-
Aha. Wir sollen dir deine Hausaufgaben machen.
Du weißt nicht, wie du ein Array befüllst?
Dann musst du im Unterricht besser aufpassen, das sind absolute Grundlagen.
-
das habe ich nicht gesagt bzw geschrieben! wäre es so wie du es darstellst dann würde ich ja demnach alle aufgabenstellungen einfach hier runter schreiben, jedoch ist das nicht der fall! ich habe nur ein problem und das habe ich oben bereits oben aufgeschrieben.
-
Wenn du uns nicht zeigst was du probierst, können wir dir nicht sagen, wo der Fehler ist.
In deinem bisher geposteteter Code kommt davon nichts vor.
-
wie bewerkstellige ich genau den lesevorgang ? ich denke mir die ganze zeit wenn ich die datei einlese dann muss ich doch ein bestimmtes limit angeben dass zb die ersten 3 zahlen gelesen werden,jedoch haben die Zahlen unterschiedliche stellen.
-
Welches Problem?
scanf
liest immer soweit, wie die Zeichen zum Formatspecifier passen.Zeig doch endlich den relevanten Code.
-
mein aktueller stand ist der code den ich vorhin hier veröffentlicht habe. ich bin total unsicher und kenne mich nicht gut aus mit der high level programmierung. ich weiss momentan nicht einmal wie ich es schaffe die dateien auszulesen und im array abzuspeichern.
ich habe keinen ansatz wie ich fortfahren soll
-
Zwecklos. Klassischer Noob.
Kann mit einfachsten Hinweisen und Beispielcodes angeblich nichts anfangen und will hier C von grundauf gelehrt bekommen.
-
Mitr folgendem (ungetesteten) Code solltest du deine Datei ohne Kommas lesen können
int daten[200], anzahl_daten=0; while (1 == fscanf(fp,"%d",&daten[anzahl_daten]) && 1) //die letzte 1 durch Test auf Arrayüberlauf ersetzen { anzahl_daten++; } for(int j=0;i<anzahl_daten;j++) printf("%3d : %5d\n", j, daten[j]);
-
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.