txt file einlesen
-
Entschuldigung wegen den englischen Begriffen.
Bei uns ist die ganze Vorlesung in Englisch. Da kommt so etwas schon manchmal vor ^^.Jetzt wo ich mir meinen Text so durchlese, komm ich drauf, dass das nicht so ganz meine hauptsächliche Frage ausspricht.
Wenn ich jetzt ein Array von meiner eingelesenen txt Datei habe, muss ich die ja auswerten. Im array[255] stehn jetzt 255 Zeichen und alle Zeichen zw "" gehören in eine neue Variable gespeichert z.B. array[3] = ", array[4] = a, array[5] = d, array[6] = g, array[7] = ".
Dann muss meine Variable x = adg sein.
Bei Zahlen ginge es ja mit 10er Potenzen, wäre aber auch sehr aufwändig...danke im voraus
lg
-
wie soll man das verstehen, das die anführungszeichen in der datei gespeichert sind und eingelesen werden?
deine frage ist zu allgemein formuliertrichard92 schrieb:
...verschieden Inhalte daraus extrahieren...
du müsstest schon etwas mehr über den aufbau des textdatei-inhaltes verraten, am besten gleich ein beispiel zeigen, wie der inhalt der datei aussehen könnte.
-
rectangle id="1" color="000033" und halt noch einige parameter mehr.
so in der art sieht das dann aus.
-
Ein bewährtes Verfahren hierfür ist z.B. das Paar fgets/sscanf, welches ggü. fscanf besser zu handhaben ist, insbesondere für Anfänger.
- mit fgets eine Zeile in einen "ausreichend" großen Puffer lesen (char[])
- mit sscanf diesen String interpretieren und dabei den sscanf-Rückgabewert auswerten
- sscanf funktioniert nur dann relativ einfach, falls gleiche Datenstrukturen in der Zeile vorkommen, weil du einen festen Formatstring angeben musst
- sind die Strukturen variabel, muss man höheren Codeaufwand betreiben (Stringteile separieren und die dann explizit auswerten)
-
Mist ich werde wohl separieren müssen.
Naja ich hab eigentlich nur dezimal Zahlen zum einlesen. Kann man da auch eine hexadez Zahl reinspeichern? Prinzipiell ja mit 0x nur wie das mit einlesen und in die var reinschreiben geht is halt ne ganz andere Sache^^.
-
Ja.
-
[fs]scanf kann auch hexadezimale Zahlen einlesen.
%d liest dezimale Zahlen
%x liest hexadezimal Zahlen (ohne 0x)
%i erkennt am Präfix welches Format gewählt wurde.
Das Präfix 0 (Null) steht für oktale Zahlen. 010 ist dann eine Dezimal 8
-
danke, das hat mir viel geholfen.
Ich hab noch eine letzte Frage!Kann man die Anzahl der Zeilen des Inputs auslesen mit einem Befehl?
lg
-
Nein.
-
Ich bin jz gerade dabei das Einlesen der Zeilen zu versuchen, aber irgendwas klappt hier nicht so ganz.
#include <stdio.h> #include <string.h> int main() { FILE *f; char file_name[100]; char daten[200]; int count = 0; printf("Welche datei wollen sie einlesen?"); scanf("%s", file_name); f = fopen(file_name,"r"); if (f == NULL) { printf("Konnte %s nicht oeffnen\n", file_name); return 0; } while (fgets(daten, sizeof(daten), f) != 0) for (count = 0; daten[count] != 'EOF'; count++) printf("%c", daten[count]); return 0; }
Ich hatte zuerst bei der for-Schleife daten[count] != 0 aber da ich ja zeilenweise einlesen will klappt das nicht so ganz.
Ich dachte mir ja sowieso, dass fgets Zeile für Zeile macht aber anscheinend scheint das nicht so zu sein. Kann man evtl über den File *f; Zeiger die nächste Zeile fürs fgets aufrufen ?Sorry, dass ich so nervig bin, aber ich hab halt gerade zum ersten Mal weils ein Nebenfach ist und ich komm damit einfach so garnicht klar weil in der VO die Befehle einfach nur vorgelesen werden.
Lg
-
while (fgets(daten, sizeof(daten), f) != NULL) fputs(daten, stdout); // fputs hängt nicht automatisch ein '\n' an
-
Mir gehts hier nicht zwingend um die Ausgabe, diese ist nur da um zu überprüfen ob auch wirklich nur die erste Zeile eingelesen wird.
Mein Problem ist es, dass ich je nach Zeile verschiedene Variablen auswerten muss und diese als int/unsigned int/hexadezimale Zahl speichern muss.
Wenn in einer Zeile eine Falscheingabe ist muss ich auch diese Zeile in welcher die Falscheingabe war ausgeben, also muss ich soweit ichs beurteilen kann die Zeilen seperat in ein Array einlesen, danach schauen in welche "Variablen-Zuweis-Fkt." ich rein muss und danach erst diese Variablen zuweißen.Von daher müsst ich die Zeilen explizit behandeln können, nur wie geht das ist die Frage.
Kann man sich hier vielleicht eine Variable machen welche sich merkt wo ich im txt file war, oder geht das nur seeehr viel komplizierter?Lg
-
richard92 schrieb:
...
Wenn in einer Zeile eine Falscheingabe ist muss ich auch diese Zeile in welcher die Falscheingabe war ausgeben, also muss ich soweit ichs beurteilen kann die Zeilen seperat in ein Array einlesen, ...Die Funktion fgets liest deine Zeile komplett in ein Array ein, wenn das Array groß genug ist. Die Auswertung kannst du also sofort nach fgets starten.
Die Ausgabe einer Falschzeile inklusive Zeilennummer kann dann auch sofort nach der Auswertung erfolgen, wenn du deiner Einlesefunktion einen Zähler spendierst, der die eingelesenen Zeilen zählt. Damit ist dein Problem gelöst.
Wenn du die (Falsch)Zeilen für spätere Ausgaben, Auswertungen, etc. brauchst,
kannst du:- Die Zeilen in char Arrays speichern(Stichwörter: dynamisches Array, char**).
- Die Zeilen in einer anderen (temporären) Datei speichern(tmpfile, tmpnam, fopen).
- Die Positionen der Zeilenanfänge per ftell in einem Array speichern( dynamisch, long int*).
-
CJosef schrieb:
- Die Zeilen in char Arrays speichern(Stichwörter: dynamisches Array, char**)
Es gibt in C keine dynamischen Arrays, im Gegenteil, es ist gerade das entscheidende Merkmal eines Arrays, dass es bei seiner Definition eine feste Anzahl Elemente vorgegeben werden muss, die leidigen VLA mal ausgenommen, wobei die zumindest in C11 ja wenigstens nur noch optional sind und nicht mehr obligatorisch wie in C99.
-
richard92 schrieb:
Von daher müsst ich die Zeilen explizit behandeln können, nur wie geht das ist die Frage.
Kann man sich hier vielleicht eine Variable machen welche sich merkt wo ich im txt file war, oder geht das nur seeehr viel komplizierter?Nicht eine Variable sondern für jede Zeile eine.
typedef struct {char zeile[100];int ok;int wert;} Wert; ... Wert werte[1000];
Und dann liest du erstmal alle Zeilen in das struct-Array und kannst dann anschließend, nachdem du die Datei wieder geschlossen hast, in aller Ruhe die Daten verarbeiten.
-
Wutz schrieb:
CJosef schrieb:
- Die Zeilen in char Arrays speichern(Stichwörter: dynamisches Array, char**)
Es gibt in C keine dynamischen Arrays, im Gegenteil, es ist gerade das entscheidende Merkmal eines Arrays, dass es bei seiner Definition eine feste Anzahl Elemente vorgegeben werden muss, die leidigen VLA mal ausgenommen, wobei die zumindest in C11 ja wenigstens nur noch optional sind und nicht mehr obligatorisch wie in C99.
Na sicher kann ich mit malloc/calloc ein dynamisches Array erzeugen.
-
So jetzt hab ich das mit dem Struct Array so halbwegs hinbekommen.
while (fgets(GetInput[count].line_,sizeof(GetInput[count].line_), f) != NULL) { GetInput[count].line_count_ = count + 1; count++; }
Mein Problem ist, dass er hier bei jedem Leerzeichen abbricht, ich möchte es aber nur am Ende einer Zeile beenden. Ich hab es bereits mit != EOF probiert, sonst hab ich leider kp was ich hier noch änder könnte.
LG
-
Wer er?
fgets bricht ggü. fscanf("%s") nicht bei Leerzeichen ab. Da hast du was falsch gemacht.
-
Irgendwie hab ich da an den Compiler gedacht ;).
ich verwende noch gar kein fscanf.
Hier der ganze Code:
struct _input_ { char line_[100]; int line_count_; } GetInput[100]; int main() { FILE *f = 0; char file_name[7]; int count = 0; int count_output_struct = 0; printf("Please enter your inputs' file path:"); scanf("%s", file_name); f = fopen(file_name, "r"); if (f == NULL) { printf("Invalid Filename!"); return 0; } while (fgets(GetInput[count].line_,sizeof(GetInput[count].line_), f) != NULL) { GetInput[count].line_count_ = count + 1; count++; } for (count = 0; count <= 100; count++) { printf ("%c", GetInput[count_output_struct].line_[count]); if (count == 1) { count = 0; count_output_struct++; } if (count_output_struct == 100) break; } printf ("\n") return 0; }
wobei die ausgabe nur zur Überprüfung ist was alles eingelesen wird.
lg
-
- printf("%c") ist natürlich falsch
- die in der while-Schleife ermittelte Anzahl der Zeilen count wirfst du bei for wieder weg
- das andere Zeugs in for habe ich nicht verstanden und ist wohl Unsinn