Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Import .txt Datei mit strtok?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.05.2003, 21:49 Uhr
~cuara
Gast


Hallo!

Ich brauche Hilfe!!!

Ich habe ein Array, das man als .txt exportieren kann. So sah mein Export Funktion aus:


C++:
void CWLASimulation::ErlangExport(CString strDateiname)
{
    CFile file( strDateiname, CFile::modeWrite|CFile::modeCreate );
    CArchive ar( &file, CArchive::store );
    
    char strTemp[6] = "";    char fTemp[20] = "";
    for (int i=0; i<(GetSchritte()); i++)
    {
        sprintf(fTemp, "%.15f", m_arSimArray.ElementAt(i).m_fZeitmarke);
        ar.WriteString(fTemp);
        ar.WriteString(" \t ");
        itoa(m_arSimArray.ElementAt(i).m_iStartKnoten, strTemp, 10);
        ar.WriteString(strTemp);
        ar.WriteString(" \t ");
        itoa(m_arSimArray.ElementAt(i).m_iZielKnoten, strTemp, 10);
        ar.WriteString(strTemp);
        ar.WriteString(" \t ");
        if (m_arSimArray.ElementAt(i).m_iAufAbbau==0)
            ar.WriteString("1\r\n");
        else
            ar.WriteString("0\r\n");
    }
}



So sieht also ein Teil der .txt Datei aus:

0.273008048534393 1 5 1
0.321175515651703 6 7 1
0.328575670719147 5 7 0
0.337371945381165 3 4 0

Mein Problem ist jetzt beim Importieren der Datei.

Ich dachte so: den CString Zeile pro Zeile importieren, der dann ein langer Text ist, der alles enthält.

Dann in jeder Zeile nach "\t" suchen, um die 4 Teilen eines Datensatzes zu trennen, den in float bzw. int umwandeln ... und den Wert einzeln in das Array reinschreiben.

Ich habe es mit strtok versucht, aber irgendwie kriege ich es nicht hin. (Bin noch Anfänger!)

Ich bin sehr dankbar für irgendwelche Tips, wie ich das lösen könnte.

MfG,
Cuara

Dieser Post wurde am 18.05.2003 um 10:46 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.05.2003, 10:05 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Man könnte das z.B. so lösen:

C++:
CStdioFile File("C:\\test.txt", CStdioFile::modeRead);
CString strText;
while (File.ReadString (strText) > 0)
{
   //String verarbeiten
}
File.Close();



Suchen kannst du mit

C++:
iPos = strText.Find("\t", iPos);


Dabei musst du aber aufpassen, dass du iPos immer um 1 erhöhst, da du sonst immer an der gleichen Stelle suchen würdest.

Ich hoffe, es hilft dir einwenig weiter
mfg mike
--

Dieser Post wurde am 18.05.2003 um 10:46 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.05.2003, 10:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


oder schau hier:

www.fun-soft.de/forum/showtopic.php?threadid=2483
--
class God : public ChuckNorris { };

Dieser Post wurde am 18.05.2003 um 10:47 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.05.2003, 22:56 Uhr
~cuara
Gast


Vielen Dank - ich probier das erstmal aus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.05.2003, 10:55 Uhr
~cuara
Gast



Zitat:
mike postete

Suchen kannst du mit

C++:
iPos = strText.Find("\t", iPos);


Dabei musst du aber aufpassen, dass du iPos immer um 1 erhöhst, da du sonst immer an der gleichen Stelle suchen würdest.



Hallo Mike,

mit CStdioFile kann ich schon die Zeilen korrekt lesen -- danke! Wenn ich aber versuche, die 4 Elementen zu trennen um sie wieder ins Array zurückzuschreiben, habe ich ein Problem mit iPos.

float \t int \t int \t int \r\n

Den Float wird richtig gelesen, und zwar mit strText.Left(iPos)
Den letzten Integer ebenfalls, und zwar mit strText.Right(iPos,1)
Nur die zwei mittleren Integer "findet" er nicht. Ich versuche es gerade mit strText.Mid(iPos,1), aber klappt leider noch nicht.

Ich verstehe, dass ich iPos nach dem ersten Tab erhöhen sollte, aber kannst Du mir bitte sagen an welcher Stelle genau? Weil egal um wieviel ich erhöhe, liest er immer wieder nur das erste Element (der Float).

Danke Dir!

Gruss,
cuara.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.05.2003, 13:53 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Ich habe bis damals die Funktion strtok nicht gekannt, weil sie nicht zur MFC gehört löl
Aber ich denke, sie würde dein Problem schneller lösen - man lernt eben nie aus


C++:
#include <string.h>
....
char * str;
char * pch;
float f = 0;
CString strText;

CStdioFile File("C:\\test.txt", CStdioFile::modeRead);

while (File.ReadString (strText) > 0) {
   str = strText.GetBuffer(0);
   pch = strtok (str," ");
   while (pch != NULL) {
      f = atof(pch);
      pch = strtok (NULL, " ");
   }
}
File.Close();



Müsste eigentlich funtzen
mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.05.2003, 14:23 Uhr
~cuara
Gast


Okay Mike -- das versuche ich noch mal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.05.2003, 14:51 Uhr
~cuara
Gast



Zitat:
mike postete


C++:
#include <string.h>
....
char * str;
char * pch;
float f = 0;
CString strText;

CStdioFile File("C:\\test.txt", CStdioFile::modeRead);

while (File.ReadString (strText) > 0) {
   str = strText.GetBuffer(0);
   pch = strtok (str," ");
   while (pch != NULL) {
      f = atof(pch);
      pch = strtok (NULL, " ");
   }
}
File.Close();





Hallo,

damit hat s jetzt endlich geklappt mit den Daten einlesen und ins Array reinschreiben. Nochmals danke!

Ich wollte noch mal fragen, wie ich die Header Daten lesen kann, die ich zur Zeit in der obersten 2 Zeilen stehen habe (kann ich auch in die 2 letzten Zeile exportieren -- was immer einfacher zum Importieren ist)

Die Header Daten beinhalten folgendes:

int \t int \t int \t int \r\n
string \t float \t int \t float \r\n

im Gegensatz zu den Rest des Datens:

float \t int \t int \t int \r\n

Vielleicht sollte ich statt 'while (File.ReadString (strText) > 0)' was anderes nehmen, damit diese erste Loop nur die ersten 2 Zeilen liest?

Gruss,
cuara.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.05.2003, 15:00 Uhr
~cuara
Gast


Hallo,

ich glaube, ich habe das Problem schon gelöst........ danke!

cuara
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: