Array parsen in "C"

OP #3833928
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
#3833938
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.
Gast #3833941
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
OP #3833973
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
#3834002
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/
Gast #3834017
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
Gast #3834021
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
#3834030
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
}
OP #3834045
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.
#3834087
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.
#3834089
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
#3834096
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren