Textdatei String einlesen und teilen

Jens Bond

Mitglied
Hallo

Ich habe eine Textdatei

1*.*String1*.*String2*.*String3
2*.*String1*.*String2*.*String3

usw.

Ich möchte nun diesen Inhalt auslesen und in ein Array packen. Mein Problem is nun das die einzelnen Datensatz also 1 und String1 usw. auch einzeln in dem Array stehen sollen. Meiner meinung gibt es in c++ meine 3D arrays oder teusche ich mich da?
Wie teile ich den String am besten auf oder ist es besser die Datei immer nur zu den bestimmten zeichen auszulesen?

MFG
Jens
 
hmm... n ähnliches problem hatte ich auch mal.

hier mal ein codeauzug aus meiner lösung.

Code:
for(int i = 1, j = 0; j<=4; j++, i++)
{
 while((i<temp.Length())&&(temp.SubString(i,1)!=" "))
 {
  fertig[j]+=temp[i];
  i++;
 }
}

"temp" is deiner eingelesene textzeile (als trennzeichen benutzte ich einfach ein leerzeichen) und
"fertig" is dein String array mit den einzelnen strings. (ich glaub, das hatte bei mir max. 4 felder, dass solltest du dann in deinem programm anpassen...)

ja, ich glaub so hatte das damals funktioniert... :rolleyes:
 
Moin,
gibt sogar 4D-Arrays, muss man nur selbst machen:-)
Aber Schertz bei Seite. Deine Frage hört sich zwar "einfach" an, aber wenn man mal etwas weiter schaut, dann kann man mitten in die Diskussion über dynamische/ Statische Speicher Allokierung einsteigen.
Daher ein paar obligatorische Fragen:
1) kannst du schon zum Compile Zeitpunkt sagen wieviele Elemente die Zeile maximal hat?
2) wie oft diese maximale Fülle erreicht wird?
3) nutzt du MFC? Da könnte man das mit nem einfachen Array über ne CStringList machen.
4) je nachdem wie Variabel die Daten sind muss man sich eine Trennungssequenz ausdenken um zwischen zwei Strings unterscheiden zu können. In jeder Datei steckt eh nur ein mehr oder weniger grosser String. Was daraus wird ist jediglich eine Frage der Interpretation:-)

Gruss Michael
 
Hmmm wie viel elemente das array haben soll gte frage sagen wir mal 500. Wir nicht oft erreicht also denk mal werde selten 500 erreichen. Könnte auch sein das es viel viel wenig ist.
Ja ich nutze MFC

Habe mir doch nen Trennungszeichen ausgedacht *.* ?!



EDIT:

ich glaube ich mach es besser so das ich die ganze Datei zeile für zeile in ein array schreibe und je nach dem was ich brauche die zeile nehme und dann den String zerteile? oder?
Aber wie zerschnippel ich den obrigen String und packe ihn in ein weiteres array?
 
Zuletzt bearbeitet:
Hi!
Wenn du MFC nutzt mach mal folgendes:
-Datei Zeile für Zeile einlesen
-in CString tmp speichern (nur tmporär)
-dann mit tmp.Find(...) nach deinem Trennzeichen zuschen.
-entsprechendes ausschneiden und in CStringList hinzufügen

entweder ist CStringList nen statischer Array oder du machst den dynamisch. Dann musst du vorher einmal alle Zeilen zählen oder dir die Anzahl Zeilen ganz am Anfang in die Datei schreiben.

Meiner Meinung nach ist das der beste Kompromiss zwischen Speicher-Verschwendung und eigenem Arbeitsaufwand.

Gruss Michael
 
Hi.

Du könntest es z.B. so machen:
Code:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

vector<string> split (const string& str, const string& sep) {
  typedef string::size_type sz_t;

  sz_t pos = 0, end;
  sz_t len = sep.length ();
  
  vector<string> result;

  while ((end = str.find (sep, pos)) != string::npos) {
    
    result.push_back (str.substr (pos, end-pos));
    
    pos = end+len;
  }
  result.push_back (str.substr (pos));
  
  return result;
}

int main () {
  string s = "1*.*String1*.*String2*.*String3";
  
  vector<string> vs = split (s, "*.*");

  copy (vs.begin (), vs.end (),
	ostream_iterator<string> (cout, "\n"));
}

Die Zeilen der Datei kannst du natürlich auch gesplittet in einen Vektor packen.

Code:
string line;
vector<vector<string> > splitted_lines;

while (getline (txt_file, line)) {
  splitted_lines.push_back (split (line, "*.*"));
}

Gruß
 
Zurück