Textdatei bearbeiten mit C++

Steven_k

Grünschnabel
Hallo miteinander,
ich hab folgendes Problem.
Ich will aus einer Textdatei die ungefair so aussieht auslesen mit Borland C++

"R19","36K5",A07,0,191110,67430,"",A,F,0,0,0,0,0,0
"R24","4K64",B11,0,204080,50650,"",A,F,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
"R25","4K64",B11,0,203430,45100,"",A,F,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.
.

Die rot markierten Stellen sind die wichtigen der Rest ist Müll.
Mein Quelltext sind folgendermaßen aus

struct T_Bauteilname
{
int Koordinate_X ;
int Koordinate_y;
int Fortlaufende_Nr;
};

using namespace std;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
fstream f("c:\\test.txt",ios::out|ios::in);
char buffer[255];
if(f.good())
{
f.getline(buffer,sizeof(buffer));

}
else
ShowMessage("Fehler beim öffnen der Datei");
f.close();


Mein Vorhaben ist, die rot hinterlegen Daten, der Datei T_Bauteilname zuordnen. Das bedeutet z.B. es gibt eine Variable Namens 4k64 vom typ T_Bauteilname.
Desweiteren soll gezählt werden wie viele Bauteiltypen ("z.B. 4k64) vorhanden sind.

Meine Frage ist nun wie ich die Text Datei so einlese, dass ich die Daten dem Typ T_Bauelemente zuordnen kann.
muss irgendwei mit dem Befehl strtok( Datei, " ,") gehen.

Bin für jede art von hilfe dankbar
 
Hallo Sven,

müsste nicht die Funktion strstr() für dich gelten, da du ja nach festen Zeichenketten innerhalb einer Zweiten suchst. Oder du arbeitest mit strings da gibt es ne find()-Funktion.

vielleicht hilft dir das ja schon, denn ich hab noch nicht ganz verstanden was du genau machen willst..:confused:
 
Bin mir nicht sicher aber bei der strstr() Funktion muss man wissen wonach man sucht.
Dies weis ich aber nicht.
Hier die komplette Textdatei
Die wichtigen daten sind die Rot hinterlegten, Rest ist Schrott

"R19","36K5",A07,0,191110,67430,"",A,F,0,0,0,0,
"R24","4K64",B11,0,204080,50650,"",A,F,0,0,0,0,
"R25","4K64",B11,0,203430,45100,"",A,F,0,0,0,0,
"R22","4K64",B11,0,197700,54450,"",A,F,0,0,0,0,
"R21","133K",A09,0,213660,60220,"",A,F,0,0,0,0,
"R4","10K",A10,90,19960,68510,"",A,F,0,0,0,0,0,
"R5","10K",A10,90,24710,69700,"",A,F,0,0,0,0,0,
"C4","100nF",A11,0,188040,74040,"",A,F,0,0,0,0,
"C5","100nF",A11,90,33890,53040,"",A,F,0,0,0,0,
"C6","100nF",A11,0,4610,52840,"",A,F,0,0,0,0,0,
"C7","10nF",A12,90,18360,61860,"",A,F,0,0,0,0,0,
"C8","10nF",A12,0,19420,73560,"",A,F,0,0,0,0,0,0,
"R14","1M",A13,0,192530,64990,"",A,F,0,0,0,0,0,0
"R33","100K",A14,90,30230,67950,"",A,F,0,0,0,0,0,
"R32","100K",A14,0,16170,70100,"",A,F,0,0,0,0,0,0,
"T2","BCW60C",A15,0,198670,47930,"",A,F,0,0,0,0,0,
"T1","BCW60C",A15,270,191050,54390,"",A,F,0,0,0,0,
"T3","BCW60C",A15,90,213170,46250,"",A,F,0,0,0,0,0
"R27","51R1",B01,90,200060,36490,"",A,F,0,0,0,0,0,0
"R29","51R1",B01,90,193880,51240,"",A,F,0,0,0,0,0,0,0
"R28","51R1",B01,90,194910,36340,"",A,F,0,0,0,0,0,0,0,
"R15","51K",B02,0,192390,61290,"",A,F,0,0,0,0,0,0,0,
"R16","51K",B02,90,184300,67490,"",A,F,0,0,0,0,0,0,0,
"R20","51K",B02,0,209630,56410,"",A,F,0,0,0,0,0,0,0,0,
"C2","100pF",B03,0,208370,60210,"",A,F,0,0,0,0,0,0,0,
"C1","100pF",B03,90,187620,62980,"",A,F,0,0,0,0,0,0,0
"R26","43K2",B04,0,208330,47670,"",A,F,0,0,0,0,0,0,0,
"R18","7k5",B05,0,192610,58200,"",A,F,0,0,0,0,0,0,0,0
"R17","7k5",B05,90,198610,66000,"",A,F,0,0,0,0,0,0,0,
"R39","1K",B06,0,29010,74690,"",A,F,0,0,0,0,0,0,0,0,0,
"R40","1K",B06,90,27460,69640,"",A,F,0,0,0,0,0,0,0,0,
"D2","ZMY22",B07,270,38420,55470,"",A,F,0,0,0,0,0,0,0,
"D3","ZMY22",B07,0,5960,60390,"",A,F,0,0,0,0,0,0,0,0,
"U1","LM2903D",A01-06,90,201210,60030,"",A,F,0,0,0,0
"T4","BCV49",A16,180,14200,63230,"",A,F,0,0,0,0,0,0,
"T5","BCV49",A16,180,22770,62760,"",A,F,0,0,0,0,0,0,

Man erkennt, dass das Komma nicht immmer an gleicher Stelle ist.

Das Programm das ich schreiben will, soll eine Wegberechnung machen zwischen dem Bauteil (z.B BCV49) und einem festen Fixpunkt.
-> dies alles funktioniert soweit.
Nur das einlesen bzw. das Ausschneiden der Textdatei breitet mir Schwirigkeiten.
Ideal wäre es wenn z.B ein Array erzeuge z.b Namens
float 4K64_1[2]={Koordinate_X, Koordinate_Y};
Ich wies natürlich nicht wie oft der Name 4K64 in dem Textfile vorkommt.
Das heißt ich müsste noch zählern wie oft die Datei in dem Textfile vorkommt.

Die Idee was ich am Anfang hatte war Müll (das mit dem struct T_Bauteilname).

Kurz und bündig, es sollen ein Arrays erzeugt werden die den Namen aus dem Textfile haben. Anschließend soll in dem Array die entsprechenden x und y Koordinaten untergebracht werden.

Hoffe du kannst es vieleicht ein bischen nachvollziehen.
Bin für jede Guten Rat dankbar
 
Hi Steven!

Ich versteh noch nicht, warum du nicht weißt nach was du suchst?
woher weißt du, dass die roten Werte die gesuchten sind. Warum kannst du das deinem Prog nicht sagen?
So wie ich sehe ist der erste Wert den du suchst meist nach dem ersten Komma, richtig? Möglicherweise würde dann dies Funktion strspn() (in deinem Fall strspn(zeile.c_str(), ",")) weiter helfen. So könntest du das erste Komma lokalisieren und den Wert danach auslesen.
Warum kannst du nicht nach "36K5" suchen? Irgendwann musst doch festgelegt sein welchen Namen du suchst.

PS: Sehe grad, ich hab das letzte mal deinen Namen falsch geschrieben.:-(
 
ich noch mal,

hab grad blödsinn gepostet.
strspn() gibt die Position des ersten Auftretens eines Zeichens an, das nicht vorkommt.
Aber strstr() oder strchr() mit dem Suchenzeichen "," geben dir doch die Position des ersten Komma. Also sollte das doch auch funktionieren.
 
Hallo Steven,

strtok ist eine sehr gefährliche Funktion, sie ist veraltet.
In C++ macht man solche Sachen mit Streams.
Mit einem Stream kannst Du ales mögliche einlesen, typsicher.

Hier ist mein Vorschlag. Prinzip ist:
Zeilenseise einlesen. (Achtung, eine sicherere getline Methode mit std::string-parameter)
Kommas, und Anführungszeichen durch Leerzeichen ersetzen, Leerzeichen sind die
Trennzeichen (standardmäßig) bei streams.
Aus der geänderter zeile wieder ein Stream erzeugen mit stringstream und felderweise einesen.
Ich hoffe, dass Borland C streas, algorithms und templates unterstützt.
Code:
// Valentin Heinitz, http://www.heinitz-it.de,2007-04-05
// Text parsen. C++ Beispiel
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>

using namespace std;

struct T_Bauteilname
{
int Koordinate_X ;
int Koordinate_Y;
string Fortlaufende_Nr; // 36K5 ist kein int
};


int main(int argc, char *argv[])
{
    ifstream ifs("data.txt");
    string line;
    list<T_Bauteilname> bauteile;
    while( ifs.good() && !ifs.eof() )
    {
           getline(ifs, line);
           replace(line.begin(), line.end(),',',' ');
           replace(line.begin(), line.end(),'"',' ');
           stringstream sstr(line);
           string s1,s2,s3;
           T_Bauteilname bn;
           sstr >>s1>> bn.Fortlaufende_Nr >> s2>>s3>>
                          bn.Koordinate_X>>
                          bn.Koordinate_Y;
           bauteile.push_back(bn);
    }
    // Ausgabe
    for (list<T_Bauteilname>::iterator it=bauteile.begin(); it!=bauteile.end(); ++it )
    {
        cout << "NR: "<< (*it).Fortlaufende_Nr<<", X:"<<(*it).Koordinate_X
             <<", Y:"<<(*it).Koordinate_Y<<endl;
    }
    
 return 0;
}
Gruß!
 
Zurück