Forum: PC-Programmierung Array parsen in "C"


von Jim S. (jimstreet)


Lesenswert?

Hallo Community,

ich möchte in der Programiersprache "C" ein Array welches ich einlese in 
mehrere kleine Array's aufteilen. Jedoch gibt es dabei Teile die ich 
auch gar nicht brauche.
Zur Verdeutlichung:

Ich lese folgendes Array ein:

   0.123456 1  99              xx   d 8 01 02 03 04 05 06 07 08  Length

Und ich muss daraus 4 kleine Array's bauen:
Array1: 0.123456
Array2: 99
Array3: 8
Array4: 01 02 03 04 05 06 07 08

Da ich blutiger Anfänger bin, nehmt bitte etwas Rücksicht ;-)
Ich habe absolut keine Ahnung wie ich das Umsetzen kann.

Vielen Dank, Jim

von Dennis S. (eltio)


Lesenswert?

Hallo Jim,

du solltest genauer spezifizieren was du genau aus dem Array benötigst. 
Generell ist es vielleicht schon mal eine gute Idee den eingelesenen 
String anhand der Leerzeichen zu separieren. Schau dir dafür mal die 
Funktion "strchr" genauer an.

Gruß
Dennis

P.S.: Generell wäre auch eine wichtige Information, ob der Quellstring 
immer das gleiche Format hat oder nicht.

: Bearbeitet durch User
von guest (Gast)


Lesenswert?

Jim Street schrieb:
> Ich lese folgendes Array ein:
>
>    0.123456 1  99              xx   d 8 01 02 03 04 05 06 07 08  Length

Bist Du Dir sicher?
welchen Datentyp hat das array?
Der Rest sieht ja nach char oder int aus, aber 0.123456?? das ist ein 
float. der kann nicht mit einem int oder char im selben array stehen.

Oder ist das gar im ASCII-Format? dann musst Du ggf die Werte noch in 
die entsprechenden Datentypen deiner Ziel-Arrays umwandeln. Ich bin mir 
sicher, dass du nicht mit Texten, sondern mit Werten weiterarbeiten 
möchtest

von berliner (Gast)


Lesenswert?

geht mit Struct und Union

von Jim S. (jimstreet)


Lesenswert?

Vielen Dank erstmal für die schnellen Antworten.

Also ich habe mich vielleicht etwas falsch ausgedrückt.
Ich weiß noch gar ned als was oder wie ich das einlesen kann.
Aber ich muss mehrere Zeilen aus einem Textdokument einlesen, die alle 
gleich aufgebaut sind.
Und zwar so (auch mit den Leerzeichen):

   0.123456 1  99              xx   d 8 01 02 03 04 05 06 07 08  Length

Und ich muss daraus jeweils 4 kleine Array's bauen:
Array1: 0.123456 (ist ein Zeitstempel float)
Array2: 99 (ist eine Zahl)
Array3: 8 (ist eine Zahlt)
Array4: 01 02 03 04 05 06 07 08 (sind 8 Zahlenpaare)

Dankeschön

von Dennis S. (eltio)


Lesenswert?

Okay, das vereinfacht die Sache: scanf [1] sollte dich ans Ziel führen! 
Versuch erstmal eine Zeile einzulesen. Anschließend verpackst du das in 
eine Schleife bis die letzte Zeile erreicht ist. Gegebenenfalls musst du 
den Speicher für deine Zielarrays dynamisch allozieren (malloc [2]). 
Jetzt bist du dran: mach einen ersten Entwurf, dann hilft hier bestimmt 
jemand weiter. :-)

Gruß
Dennis

[1]: http://www.cplusplus.com/reference/cstdio/sscanf/
[2]: http://www.cplusplus.com/reference/cstdlib/malloc/

: Bearbeitet durch User
von jonas biensack (Gast)


Lesenswert?

Stehen die Zeichen immer an der gleichen Stelle in der Zeile?

Also so:

0.123456 1  99              xx   d 8 01 02 03 04 05 06 07 08  Length
0.123456 1  99              xx   d 8 01 02 03 04 05 06 07 08  Length
0.123456 1  99              xx   d 8 01 02 03 04 05 06 07 08  Length
0.123456 1  99              xx   d 8 01 02 03 04 05 06 07 08  Length

Dann ist es kinderleicht.


Gruß Jonas

von jonas biensack (Gast)


Lesenswert?

So ungefähr, mehr verrat ich mal noch nicht

Ermittle Anzahl der zeilen in der Datei
Initalisiere Array of structs mit ermittelter Anzahl
Für jede eingelesene Zeile
   extrahiere Float von Stelle 0-8 und schreibe in Array
   extrahiere int von stelle 14-15 und schreibe in Array
   ...


feddisch

von Daniel A. (daniel-a)


Lesenswert?

Ungetestet und ohne fehlerbehandlung mit bösen gotos:
1
#include<stdio.h>
2
3
struct werte_t {
4
  float a;
5
  int b,c,d[8];
6
};
7
8
void getWerte(const char* file, werte_t** werte, int* size){
9
  werte_t w;
10
  FILE* f = fopen(f);
11
  parser: {
12
    fscanf(f,"%f 1 %d xx d %d %d %d %d %d %d %d %d %d Length\n", &w.a,&w.b,&w.c,w.d,w.d+1,w.d+2,w.d+3,w.d+4,w.d+5,w.d+6,w.d+7);
13
    if(feof(f))goto end;
14
    *werte = (werte_t*)realloc(*werte,++(*size)*sizeof(werte_t));
15
    (*werte)[(*size)-1] = w;
16
    goto parser;
17
  }
18
  end: fclose(f);
19
}
20
21
int main(){
22
  int werteSize=0;
23
  werte_t* werte=0x0;
24
  getWerte("file.txt", &werte, &werteSize);
25
26
  // werte hier verwenden
27
28
  if(werte) free(werte);
29
}

: Bearbeitet durch User
von Jim S. (jimstreet)


Lesenswert?

Kinderleicht :-D

Ich möchte nochmal kurz erwähnen:
Ich bin absoluter Anfänger im Programmieren und bringe es mir selber 
bei.

Also ja, die Zeichen stehen immer an der gleichen Stelle.

Magst du mir bitte verraten wie ich:

Die Anzahl der Zeilen in der Datei ermittel
Ein Array of structs mit ermittelter Anzahl initialisiere
Und vor allem, wie ich etwas extrahiere und in ein Array schreibe

Das wäre echt top, dann könnte ich das versuchen nachzuvollziehen und 
der heutige Tag hätte sich doch gelohnt.

von Karl H. (kbuchegg)


Lesenswert?

Jim Street schrieb:
> Kinderleicht :-D
>
> Ich möchte nochmal kurz erwähnen:
> Ich bin absoluter Anfänger im Programmieren und bringe es mir selber
> bei.

Dann solltest du dir ein Buch besorgen.

In jedem noch so grindigem Buch gibt es einen großen Abschnitt über 
Dateibehandlung. Der fängt so ungefähr in der Mitte des Buches an. Alles 
was davor im Buch steht ist so ziemlich unabdingbares Vorwissen, das man 
beherrschen sollte, wenn man zu Arbeiten mit Dateien kommt.
Es bringt daher nichts, ohne dieses Wissen in der Mitte des Buches 
anzufagen. Und es bringt schon gar nichts, ohne Buch anzufangen. Denn 
dann weißt du gar nicht, was du eigentlich schon alles können solltest, 
um mit Dateien arbeiten zu können.

von Dennis S. (eltio)


Lesenswert?

Jim Street schrieb:
> Kinderleicht :-D
Zumindest nur eine Variation von typischen Einsteigeraufgaben (Zähle 
Zeilen / Wörter, ...)

> Das wäre echt top, dann könnte ich das versuchen nachzuvollziehen und
> der heutige Tag hätte sich doch gelohnt.
Man kann programmieren nicht nur durch Sourcecodes und ansehen und 
nachvolziehen erlernen! Du brauchst ein Buch mit Übungen die du selber 
machst!

Gruß
Dennis

Edit: Ach, der Karl Heinz wieder... tippt schneller als andere denken 
können! :-D

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Im übrigen:
Das hatten wir doch vor ein paar Tagen schon mal?

genau. Hier:
Beitrag "Frage zu "C" Array Aufteilung"

Da hab ich dir vorgekaut, wie du aus einer Textdatei zeilenweise 
einlesen kannst. Wie ich hinzufügen möchte, absolut triviale Aufgabe.
Und jetzt steckst dau fest, wie du eine einzelne Zeile in Teile zerlegen 
kannst?

Ehrlich: du brauchst Literatur!
Das sind bis jetzt absolut einfache Dinge. Da ist noch nichts irgendwie 
Schwieriges in der Aufgabenstellung. Einen Text in Einzelteile zu 
zerlegen (sscanf) lernt man in jedem Buch im ersten Drittel.
Du kannst das ruhig glauben. Ohne Buch, mit dem du systematisch lernst, 
kommst du nicht weit. Programmieren ist nun mal eine der 
anspruchsvollsten Tätigkeiten, gleich nach Herztransplantation. Das 
lernt man nicht zwischen Tür und Angel.

von jonas biensack (Gast)


Lesenswert?

[ironie on]
Ach quatsch doch nicht karl-heinz, bald brauchst du nicht mehr proggen 
lernen sondern labberst einfach dein dünnes und der rechne baut daraus 
ein funktionierendes Programm

http://www.heise.de/newsticker/meldung/KIT-Forscher-entwickeln-Tool-fuer-natuerlichsprachige-Programmierung-2412607.html

[ironie off]

Haha, kauf dir ein Buch

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.