Daten von Textdatei in verschiedene Strings lesen
-
while (fgets (buffer, 500, datei) != NULL)
{
strcpy(name, buffer);
}schön jetzt kopierst den ganzen string;) dachte er will den string gesplitter haben
so ungefähr.. nicht gesttestet
strncpy(name,buffer,strchr(buffer,';'));
-
BorisDieKlinge schrieb:
while (fgets (buffer, 500, datei) != NULL)
{
strcpy(name, buffer);
}schön jetzt kopierst den ganzen string;) dachte er will den string gesplitter haben
so ungefähr.. nicht gesttestet
strncpy(name,buffer,strchr(buffer,';'));
Hast Du den Thread auch weiter gelesen?
-
Ich will den string schon gesplittet haben. Am besten habe ich neue string Variablen name, vorname usw. und lasse dann den kompletten string da rein schreiben, gestückelt.
-
gnome.gemini schrieb:
Ich will den string schon gesplittet haben. Am besten habe ich neue string Variablen name, vorname usw. und lasse dann den kompletten string da rein schreiben, gestückelt.
Haben deine Zeilen eine feste Maximallänge und sind sie mit einem '\n' abgeschlossen ?
-
Ich weiß nicht, ob diese abgeschlossen sind. Es ist eine einfache Textdatei. Ich vermute mal, da dies auf verschiedenen Zeilen steht.
Angenommen, dies ist die Textdatei:
Hans;Kuchen;30
Otto;Brot;23
Mejer;Käse;50So will ich jeden einzelnen Datenabschnitt einem String zuweisen. Hierfür habe ich bereits eine Struktur.
struct daten { char name[10]; char vorname[10]; int alter[2]; };
Und nun brauche ich den Abschnitt, der es mir ermöglicht mit
struct daten x; printf("%d, %s\n", x.name[0], x.alter[0]);
Daten vereinzelt ausgeben zu lassen. Dafür muss ich den String auseinander friemeln um dann jedes kleine Teilstück einer Variable meiner Struktur zuweisen zu können. Ich bin am verzweifeln, aber froh, dass mir jemand hilft.
-
So in etwa, ohne Garantie auf Korrektheit. Es werden noch keine Längen o.ä. geprüft, also kann es knallen, wenn die gelesenen Strings zu groß werden. Außerdem ist die Anzahl der gelesenen Einträge noch fix. Also noch eine Menge zum Üben, für Dich.
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct record { char name[50]; char vorname[50]; char tel[30]; char wohnort[80]; }record_t; int main() { const char delim[] = ";\n"; FILE *datei; char readbuf[500]; char* token; unsigned int entry_count; unsigned int record_count; unsigned int lines_read; char* entry[4]; record_t* records; // im moment nur 50 eintraege. besser zeilen zaehlen und dyn. anlegen if( (records = malloc(sizeof(record_t) * 50)) == NULL ) { exit(0); } memset(records, 0, sizeof(record_t) * 50); if ((datei = fopen("test.txt", "r")) == NULL) { exit(0); } lines_read = 0; record_count = 0; while ( (fgets (readbuf, 500, datei) != NULL) && (record_count < 50 ) ) { entry[0] = records[record_count].name; entry[1] = records[record_count].tel; entry[2] = records[record_count].vorname; entry[3] = records[record_count].wohnort; ++record_count; entry_count = 0; token = strtok(readbuf, delim); while( (token != NULL) && (entry_count < 4) ) { strcpy(entry[entry_count], token); ++entry_count; token = strtok(NULL, delim); } } lines_read = record_count; for(record_count = 0; record_count < lines_read; ++record_count) { printf("Satz: %u\n", record_count); printf("Name: %s\n", records[record_count].name); printf("Vorname: %s\n", records[record_count].vorname); printf("Tel: %s\n", records[record_count].tel); printf("Ort: %s\n\n", records[record_count].wohnort); } free(records); return 0; }
-
Wenn die Textdatei so aussieht, dann sind die Zeilen mit einem '\n' abgeschlossen.
Schreibst du die Textdatei selbst oder wo kommt die her.
Es ist wichtig zu wissen, ob Maximallängen für
- eine Zeile
- für die Namen
gegeben sind.Dann kann das Einlesen vereinfacht werden.
-
wieso verzweifelt, ist das ne hausaufgabe ?
-
Leider ja...
Danke für die Lösung. Probier ich sofort aus.
-
darfst du malloc benutzen ?
oder haben die zeilen eine maximale länge ?
-
Funktioniert. vielen Dank. Auch für die Mühe!
-
Wie könnte ich jetzt, um das kleine i-Tüpfelchen noch zu bekommen, eine eventuelle Kommentierung "auslöschen"? Einfaches hinzufügen von # zu delim? Also alle Zeilen, welche mit # beginnen.
-
gnome.gemini schrieb:
Wie könnte ich jetzt, um das kleine i-Tüpfelchen noch zu bekommen, eine eventuelle Kommentierung "auslöschen"? Einfaches hinzufügen von # zu delim? Also alle Zeilen, welche mit # beginnen.
Ein bischen musst Du schon selbst machen. Sonst ist der Lerneffekt quasi 0.
-
OK. Danke...
Eine Frage noch. Ich verstehe nicht, was Du in Zeile 24 machst...Meine Struktur lieg in einer anderen Datei, welche ich per #include mit eingebunten habe. Wenn ich jetzt
struct record records;
mache, so meint der Compiler, "storage size of 'records' isn't known".
Was meint der wieder. Ich hasse Strukturen und Pointer...
-
es kommt darauf an, *wo* du diese Zeile sich befindet. Wo hast du sie?
-
mal ne bläde frge, würde das nich funktionieren
typedef struct record { char name[50]; char vorname[50]; char tel[30]; char wohnort[80]; char Kommentar[80]; }record_t; //... schleife sscanf (acBuf,"%s;%s;%s;%s#%s",record_t.name, record_t.vorname, record_t.tel, record_t.wohnort, record_t.Kommenatr);
hab noch nie mit sscanf gearbeitet.
strtok wäre dynamischer
-
BorisDieKlinge schrieb:
mal ne bläde frge, würde das nich funktionieren
Prüft die Bufferlängen leider nicht. Funktionieren würde es aber.
-
Die Struktur befindet sich in einer anderen Datei, in der noch weitere Strukturen erzeugt werden. Diese binde ich mit #include ein.
Anschließend versuche ich ein struct record p_record[50];
Der Compiler meint in dieser Zeile "error: array type has incomplete element type". Was ist das?
-
Ich habe dies umgeändert in:
struct record p_record;
und nun funktioniert es. Jedoch bekomme ich vom gcc die Warnung:
error: subscripted value is neither array nor pointer
Was ist da wieder falsch?
Ich greife auf die Struktur so zu:entry[0] = p_record[record_count].Name
Ich bekomm die Krise mit den Pointern und Arrays...