Forum: PC-Programmierung C: string auswerten


von Mo (Gast)


Lesenswert?

Guten Morgen in meiner C Anwendung kann ich eine Textdatei einlesen und 
auch zeilenweise ausgeben. Nun habe ich ein Problem wie ich zum Beispiel 
eine in einer Zeile zu einer bestimmten Stelle springen kann um dann die 
Werte in einen Puffer zu speichern.

Zeile:
1
1:23.10.2021:08:16:09;A;B;12 23 34 45 55 66 77;0.0 %

Was ich brauche ist der Dateninhalt
1
12 23 34 45 55 66 77

von Teo D. (teoderix)


Lesenswert?

for (n=12,m=0;n<78;n+=11,m++){buffer[m]=foo[n]}

: Bearbeitet durch User
von udok (Gast)


Lesenswert?

Hmmm, ganz einfach:
1
#include <stdio.h>
2
3
char *strbuf = "1:23.10.2021:08:16:09;A;B;12 23 34 45 55 66 77;0.0 %";
4
5
int main()
6
{
7
    char buf[100];
8
9
    memset(buf, 0, sizeof(buf));
10
    memcpy(buf, strbuf + 26, 20);
11
    printf("[%s]\n", buf);
12
13
    return 0;
14
}

von DerEgon (Gast)


Lesenswert?

Der Ansatz von Teoderix funktioniert nur, wenn die Elemente, die vor dem 
gesuchten Text stehen, immer exakt die gleiche Länge haben. Bei der 
Uhrzeit kann man davon ausgehen, beim Datum ist hingegen schon unsicher, 
ob führende Nullen verwendet werden. Steht da "01.05.2023" oder 
"1.5.2023"?

Abhilfe: Untersuche die Struktur der Zeile.

Es sieht so aus, als ob der gewünschte Text zwischen dem dritten und 
vierten Semikolon zu finden ist.

strchr durchsucht einen String nach dem Vorkommen eines Zeichens und 
gibt einen Pointer darauf (oder NULL) zurück.

Also musst Du das dritte und vierte Semikolon suchen und den Text 
dazwischen bestimmen.

von Teo D. (teoderix)


Lesenswert?

DerEgon schrieb:
> Der Ansatz von Teoderix funktioniert nur

Funst garnicht. Thema verfehlt, setzen sechs... :´(

von Mikro 7. (mikro77)


Lesenswert?

Stichwort für Internet Suche: CSV (comma separated values) bzw. hier 
https://en.wikipedia.org/wiki/Delimiter-separated_values

Umsetzung bspw. mit strtok: 
https://man7.org/linux/man-pages/man3/strtok.3.html

von Mo (Gast)


Lesenswert?

Ich hab ausversehen die Zeile falsch gepostet sorry

Korrektur:
1
1;23.10.2021;08:16:09;A;B;12 23 34 45 55 66 77;0.0 %

von DerEgon (Gast)


Lesenswert?

Teo D. schrieb:
> Funst garnicht.

Ich hatte --in dubio und so-- nicht angenommen, daß die verquaste 
Schleife da einfach nur Getrolle ist. Solches Gewurschtel untersuche ich 
nicht genauer.

Mein Punkt aber bleibt valide, und trifft den Ansatz von "udok" genauso.

von Mo (Gast)


Lesenswert?

Der string ändert sich ja von der ANzahl der Zeichen wenn die Nummer >1 
wird.
WIe kann ich dann an einer bestimmten Stelle springen um dann die Daten 
zu entnehmen?

von Klaus W. (mfgkw)


Lesenswert?

Kommt halt drauf an, was an denen Zeilen fest bleibt: für Anzahl der 
Zahlen, Doppelpunkte, Semikolone?

An irgendetwas muss man doch festmachen kommen, wonach du suchst.

von Dirk B. (dirkb2)


Lesenswert?

Du kannst auch strtok_r() benutzen, das verändert aber deinen 
Ausgangsstring.

sscanf mit "%[^;]" geht auch
1
char *text ="1;23.10.2021;08:16:09;A;B;12 23 34 45 55 66 77;0.0 %"
2
char gesuchterText[100];
3
4
sscanf(text,"%*[^;];%*[^;];%*[^;];%*[^;];%*[^;];%[^;];%*[^;]", gesuchterText);

von DerEgon (Gast)


Lesenswert?

Mo schrieb:
> WIe kann ich dann an einer bestimmten Stelle springen um dann die Daten
> zu entnehmen?

Indem Du nach der Stelle suchst. Die Anzahl der Semikola vor dem 
gewünschten Text ändert sich ja wohl nicht, oder?

Also musst Du dreimal nacheinander ein Semikolon suchen.

von Dirk B. (dirkb2)


Lesenswert?

Mo schrieb:
> WIe kann ich dann an einer bestimmten Stelle springen um dann die Daten
> zu entnehmen?

Mit Zeigeraritmethik
Dann hat man aber immer noch den Rest.

von Dirk B. (dirkb2)


Lesenswert?

DerEgon schrieb:
> Also musst Du dreimal nacheinander ein Semikolon suchen.

Fünf mal. Das Format hat sich zwischendurch geändert.

von DerEgon (Gast)


Lesenswert?

Dirk B. schrieb:
> Das Format hat sich zwischendurch geändert.

Praktisch.

Wie auch immer, der interessante Text steht also zwischen dem fünften 
und sechsten Semikolon.

Jetzt kann man entweder nach dem fünften Semikolon suchen und alle 
Zeichen bis zum sechsten Semikolon extrahieren, oder aber man schreibt 
den Kram etwas generischer und zerlegt den String in alle durch Semikola 
getrennte Bestandteile, die man sich irgendwo aufhebt und dann nach Lust 
und Laune auswerten kann.

Iterieren mit strtok wäre auch noch eine Möglichkeit, wenn es OK ist, 
daß der Quellstring zerstört wird.

von Εrnst B. (ernst)


Lesenswert?

Dirk B. schrieb:
> Du kannst auch strtok_r() benutzen, das verändert aber deinen
> Ausgangsstring.

viel zu modern :)
die Fehlersuche macht mit dem originalen strtok viel mehr Spaß
1
#include <stdio.h>
2
#include <string.h>
3
4
int main() {
5
  char input[] ="1;23.10.2021;08:16:09;A;B;12 23 34 45 55 66 77;0.0 %";
6
  strtok(input,";");
7
  strtok(0,";");
8
  strtok(0,";");
9
  strtok(0,";");
10
  strtok(0,";");
11
  printf("Data=[%s]\n", strtok(0,";"));
12
  return 0;
13
}

Ansonsten halt selber die ';' zählen:
1
  const char *input ="1;23.10.2021;08:16:09;A;B;12 23 34 45 55 66 77;0.0 %";
2
  for (int i=0; *input && i<6; ++input)
3
    if (*input==';') i++;
4
    else if (i==5) putchar(*input);

: Bearbeitet durch User
von Mo (Gast)


Lesenswert?

Ich danke euch vielmals. Ich versuche mal mein bestest.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Ich würde das einfach mit regulären Ausdrücken suchen.

";[0-9]{1,2} " + 1 -> findet Position des ersten Wertes
" [0-9]{1,2};"     -> findet Position des letzten Wertes

Je nachdem, wie lang (2 oder 3 Zeichen) die zweite Position
ist, kann man den String exakt ausschneiden, egal, ob es nun
1 - oder 2stellige Zahlen sind und auch egal wieviele.

Geht dann einfach mit etwas rechnen.
Bitte das Blank in den Suchausdrücken beachten.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Mo schrieb:
> Was ich brauche ist der Dateninhalt

Nö, Du brauchst erstmal eine Protokollbeschreibung, nach der man 
Datenbeginn und Ende erkennen kann.
Irgendwer muß ja die Syntax der Textdatei festgelegt haben.

von W.S. (Gast)


Lesenswert?

Mo schrieb:
> Der string ändert sich ja von der ANzahl der Zeichen wenn die Nummer >1
> wird.
> WIe kann ich dann an einer bestimmten Stelle springen um dann die Daten
> zu entnehmen?

Was ist für dich eine bestimmte Stelle? Durch welche Zeichen oder 
Zeichenfolgen zeichnet sie sich aus?

Dein Problem scheint zu sein, daß du einen Input (von wo auch immer) 
zeilenweise parsen mußt, um an das zu kommen, was du lesen willst. Kläre 
erstmal das erwartete Format der Zeilen und dann sehen wir weiter.

W.S.

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.