C++ array von char durch Leerzeichen zerteilen

Hallo,

hab mal eine eigentlich ziemlich simple Frage aber ich bekomme das Ganze einfach irgendwie nicht hin…
Ich habe einen charakter namens buffer = ‚0 200 GD 12344‘ Dieser soll in vier einzelne charakter zerteilt werden die im array schreiben gespeichert werden. Ich habe mir das ungefähr so vorgestellt: ( ist wahrscheinlich stümperhaft, aber ich wage es trotzdem meinen Code zu veröffentlichen:smile:)

char \*temp; //Vaiable Grösse des buffers ? stimmt das?
char \*\*schreiben = NULL; //Variable Grösse des char, und variable Zahl an Char???
int t=0;
buffer [1000]

fgets(buffer,1000,datei)
for (int i=0; i
Allerdings klappt es nicht mit der Variable temp. Ich hab es auch schon anders versucht, aber die arrays passen irgendwie nicht zusammen. 

Danke für die Hilfe...

_[MOD]: 

    -Tags um den Code eingebaut, bitte in Zukunft selbst machen_ 

Hallo Joerg,

hab mal eine eigentlich ziemlich simple Frage aber ich bekomme
das Ganze einfach irgendwie nicht hin…
Ich habe einen charakter namens buffer = „0 200 GD 12344“

s/charakter/ string /

Dieser soll in vier einzelne charakterStrings zerteilt
werden, die im array schreiben gespeichert werden.

char *temp; //Vaiable Grösse des buffers ?
stimmt das?
char **schreiben = NULL; //Variable Grösse des char, und
variable Zahl an Char???
int t=0;

temp += buffer[i]; ???
}

Allerdings klappt es nicht mit der Variable temp. Ich hab es
auch schon anders versucht, aber die arrays passen irgendwie
nicht zusammen.

Soll es wirklich C++ sein? Was Du da hast, sieht eher wie
das gute alte C aus. In C++ würde es etwa so aussehen (Garniervorschlag):

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
 
 void read\_from(const char \*filename, vector \>& schreiben)
{
 ifstream datei(filename);
 string zeile;
 while( getline(datei, zeile) != NULL ) {
 istringstream is( zeile );
 vector vs((istream\_iterator(is)), istream\_iterator());
 schreiben.push\_back(vs);
 }
}

 void print\_all(const vector \>& schreiben)
{
 for(size\_t zeile=0; zeile \>schreiben;
 read\_from("datei.dat", schreiben);
 print\_all(schreiben);
}

Was willst Du denn überhaupt machen? Vielleicht kann man ja
anders herangehen?

Grüße

CMБ

Ja es soll C++ sein. Ok ich hab die #includes usw. mal weggelassen, und ich komm aus der C Programmierung. Also so wie ich das verstehe hast du meine Frage nicht richtig verstanden… habe versucht mich extra deutlich auszurücken, hat wohl nicht geklappt.
Also mein Programm ruft in jedem Durchlauf ein externes Programm über eine batch-Datei auf. Dieses Programm schreibt seine Ergebnisse in eine Textdatei. Die Ergebnisse, welche in der Textdatei stehen möchte ich nach der Ausführung der BatchDatei mit meinem C++ Programm einlesen.
Die Ergebnisse sehen z.B. folgendermassen aus:

0 476 TL 0.234
\\
0 500 TL -413
\\
0 500 TR -5432
\\
usw…

Also in der ersten Zeile ist nach 0, 476, TL ein Leerzeichen. Hier möchte ich Trennen und sozusagen einzeln auf die WErte zugreifen können. Das einlesen mache ich mit fgets. Die Zeilen speicher ich dann in einem buffer als char. Nun brauche ich aber die Spalten einzeln. Also dachte ich mir ich lege mir einen Vektor aus vier einzelnen char an ( Spalten). Da immer unterschiedlich viele Zeilen in der Textdatei stehen, weiss ich nicht wieviele Zeilen ich brauche deswegen der Pointer.
Wenn ich alle Zeilen eingelesen habe, dann kann ich die Daten weiterverarbeiten.
So wie ich dein Programm verstanden habe, schreibst du die Zeilen „nur“ in „schreiben“. Allerdings kenne ich mich mit Iteratoren nicht aus, auch lesen in C++ Handbüchern hat da bis jetzt nicht viel geholfen. Habe denke ich alles verstanden außer die entscheidende Zeile:

vector vs((istream_iterator(is)), istream_iterator());

Wenn ich es falsch verstanden habe und dein Programm genau das macht was ich brauche, wäre es nett wenn du mir die Zeile erklärst.

Aber erstmal vielen Dank
Viele Grüsse

Hallo

Also mein Programm ruft in jedem Durchlauf ein externes
Programm über eine batch-Datei auf. Dieses Programm schreibt
seine Ergebnisse in eine Textdatei. Die Ergebnisse, welche in
der Textdatei stehen möchte ich nach der Ausführung der
BatchDatei mit meinem C++ Programm einlesen.
Die Ergebnisse sehen z.B. folgendermassen aus:
0 476 TL 0.234
\\
0 500 TL -413
\\
0 500 TR -5432
\\
usw…

Also in der ersten Zeile ist nach 0, 476, TL ein Leerzeichen.
Hier möchte ich Trennen und sozusagen einzeln auf die WErte
zugreifen können.

So wie ich dein Programm verstanden habe, schreibst du die
Zeilen „nur“ in „schreiben“.

Nee, das Programm liest Deine Datei in ein Array (von strings) ein

  1. Zeile: schreiben[0][0], schreiben[0][1], schreiben[0][2], schreiben[0][2]
  2. Zeile: schreiben[1][0], schreiben[1][1], schreiben[1][2], schreiben[1][2]
    usw.

Allerdings kenne ich mich mit Iteratoren nicht aus, auch lesen
in C++ Handbüchern hat da bis jetzt nicht viel geholfen.
Habe denke ich alles verstanden außer die entscheidende Zeile:
vector vs((istream_iterator(is)),
istream_iterator());

Das nimmt einen string, also „0 500 TL -413“, welcher in ‚is‘
steht und zerhackt ihn an den Leerzeichen, die einzelnen
kleinen strings, die dabei abfallen, finden sich in vs[0] … vs[3]
wieder. Es ist eine Initialisierung eines -Typs über
einen sog. Input-Iterator auf einem Feld des selben Typs.

Eine reine C - Lösung sähe etwa so aus:

#include 
#include 

 typedef struct {
 int s1; /\* int fuer 1. Spalte \*/
 int s2; /\* int fuer 2. Spalte \*/
 char s3[8]; /\* char[8] fuer 3. Spalte =\> max. 8 Zeichen \*/ 
 double s4; /\* Gleitkomma fuer 4. Spalte \*/
 } WERTE;

 int read\_from(char \*filename, WERTE \*\*ppWerte)
{
 int nlines = 0;
 long flen;
 char puffer[1024];
 FILE\* datei = fopen("datei.dat","rt");
 WERTE \*pw;

 fseek(datei, 0L, SEEK\_END);
 flen = ftell(datei);
 fseek(datei, 0L, SEEK\_SET);
 // Aus Dateilaenge auf Anzahl der Elemente schliessen
 // (might be optimized ...)
 \*ppWerte = pw = (WERTE \*)malloc(flen/9\*sizeof(WERTE));
 
 while(fgets(puffer, sizeof(puffer), datei) != 0) 
 if(sscanf(puffer, "%d %d %s %lf", 
 &pw-\>s1, &pw-\>s2, pw-\>s3, &pw-\>s4) == 4) {
 ++nlines;
 ++pw;
 }
 
 fclose(datei);
 return nlines; 
}


void print\_all(WERTE\* werte, int nWerte)
{
 int zeile;
 for(zeile=0; zeile

Grüße

CMБ

Hallo.

hab mal eine eigentlich ziemlich simple Frage aber ich bekomme
das Ganze einfach irgendwie nicht hin…
Ich habe einen charakter namens buffer = „0 200 GD 12344“
Dieser soll in vier einzelne charakter zerteilt werden die im
array schreiben gespeichert werden.

Die Funktion sscanf könnte helfen.
Das sieht dann in etwa so aus:

char buffer[1000], col1[1000], col2[1000], col3[1000], col4[1000];

fgets(buffer, 1000, datei)
if (sscanf(buffer, "%s %s %s %s", col1, col2, col3, col4) != 4)
{
 printf("Error: Did not find 3 spaces in input data\n");
}
else
{
 printf("The 4 fields are:\n":wink:
 printf("1: %s\n", col1);
 printf("2: %s\n", col2);
 printf("3: %s\n", col3);
 printf("4: %s\n", col4);
}

Sebastian.

Hallo,

sensationell, Danke dass du dir soviel Arbeit gemacht hast… klappt einwandfrei

Viele Grüsse
Joerg