String zu aufteilen und variabeln dras machen

looki

Grünschnabel
ich hab nun schon ein halben tag im netz rumgesucht aber nichts gefunden was mir weitergeholfen hat.
Mein Problem ist folgendes:
Ich hab aus einer datei einen string eingelesen. VOm aufbau ist der so;
123,13 12
321 33,3
....
nun will ich jede zahl als einzelne Variable(von einem variabeln array) bekommen.
nur weis ich nicht wie man das macht. Man müsste den string so aufteilen, dass jede zahl ein eigener string ist, dann kann man die ja zu zahlen machen.
Vllt weis hier ja jemand wie es geht. Vielen Dank
 
Hi.

Gibt es einen Grund dafür, das du nicht gleich die Zahlen aus der Datei liest, sondern erst einen String? Wenn nein, dann nimm einfach scanf und lies die Zahlen in deine Array Variable ein.

Wenn ja, dann kann man in C dafür die sscanf Funktion benutzen:
Code:
#include <stdio.h>
...
#define A_MAX 20
float a[A_MAX];
int i = 0;
char* string = "123,13 12"
float f;
while (i < A_MAX && sscanf(string, "%f", &f) == 1) {
  a[i++] = f;
}

In C++ würde ich das mit einem ostringstream (Header: <sstream>) machen.
 
moin


Vorgehensweise:
- Ausgangsstring zeichnweise in ein 2. Array laden
- Wenn du bei einem Leerzeichen angekommen bist, anhalten
- Den bis jetzt kopierten String mit aoti oder atof in eine Zahlenvariable laden
- Wieder beim ersten Schritt anfangen

Anmerkung:
- atof erkennt , nicht als Trennzeichen, du müsstest also vorher die , in . umwandeln


mfg
umbrasaxum
 
- Ausgangsstring zeichnweise in ein 2. Array laden
- Wenn du bei einem Leerzeichen angekommen bist, anhalten
- Den bis jetzt kopierten String mit aoti oder atof in eine Zahlenvariable laden
- Wieder beim ersten Schritt anfangen

Das geht auch einfacher:

Code:
NAME
       strtok, strtok_r - extract tokens from strings

SYNOPSIS
       #include <string.h>

       char *strtok(char *s, const char *delim);

       char *strtok_r(char *s, const char *delim, char **ptrptr);

DESCRIPTION
       A  `token'  is  a  nonempty  string  of characters not occurring in the
       string delim, followed by \0 or by a character occurring in delim.

       The strtok() function can be used to parse the string  s  into  tokens.
       The  first call to strtok() should have s as its first argument. Subse-
       quent calls should have the first  argument  set  to  NULL.  Each  call
       returns  a  pointer  to the next token, or NULL when no more tokens are
       found.

       If a token ends with a delimiter, this delimiting  character  is  over-
       written  with a \0 and a pointer to the next character is saved for the
       next call to strtok().  The delimiter string delim may be different for
       each call.

Und für das Umandeln von nem String in einen float kannst du wie schon erwähnt einen std::ostringstream
nehmen...
Gruß

RedWing
 
nein es gibt keinen Grund warum ich sie nicht gleich als zahlen einlesen sollte. wusste nur net dass das geht. Kenn mich mit den Libraries und die Funktionen net wirklich aus. Wie funktioniert das denn mit scanf? Wenn ich das wie gesagt direkt aus der datei lesen will und jede Zahl eine eigene Variable sein soll. Nochmals vielen Dank

ich hab nun sowas konstruier, nur kommen da irgendwelche komischen zahlen raus und das is ne schleife die nie aufhört.

float i[5];
while (!infile.eof())
{scanf("infile", i[5]);
cout <<i<<endl;}
infile.close();

das problem ist wohl das er immer wieder von vorne die datei einliest und so nie zum ende kommt.

Achja und es ist in C++
 
Zuletzt bearbeitet:
Also in C++ würde das folgendermaßen aussehen:
Code:
#include <iostream>
#include <fstream>

using namespace std;


ifstream infile ("datei.txt");
float f;
const int max = 20;
float a[max];
int i = 0;

infile.imbue (locale ("de_DE"));
while (i < max && infile >> f) {
  a[i++] = f;
}

Die "infile.imbue (...)" Zeile ist notwendig da du offensichtlich die deutsche Schreibweise von Komma-zahlen verwendest.
 
Ach ja, und nochmal 'ne Anmerkung zu Code a'la
Code:
while (!infile.eof()) { ... }

Das ist grundsätzlich ein falscher Ansatz auf "end of file" in der Schleifenbedingung zu prüfen und dann zu lesen.

In C/C++ ist es immer so, das man erst versuchen muß zu lesen, und dann kontrollieren kann ob die Leseaktion erfolgreich war oder evtl. EOF erreicht wurde.

Viele prüfen erst auf EOF und gehen dann davon aus, das eine Leseoperation erfolgreich sein wird. Das ist schlicht falsch und wird am Ende der Datei wirklich einen Fehler (falschen Wert) ergeben.
 
Zurück