Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zeichenlänge eines Strings ermitteln!?

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
13.06.2003, 11:30 Uhr
~Hacku
Gast


Hallo!
Ich habe ein Problem. Ich möchte einen Datensatz aus einer Textfile auslesen dessen Größe variabel ist. ich habe da bisher dieses versucht:

for(int i=0;i<anz;i++)
{
if(erg==FALSE)
{
do{
x++;
if(datum_id[x]!=';')
id[x]=datum_id[x];
else
{
erg=TRUE;
break;
}
}while(erg==FALSE);
}
}
char id_end[sizeof(x)+1];
x-=1;
for(int lala=0;lala<x;lala++)
id_end[lala]=id[lala];
cout << id_end<<endl;

Einiges mag hier dran ziemlich wirr sein, sorry...
Soweit funktioniert das Auslesen auch, jedoch immer genau ein Zeichen (das letzte) zu wenig. Habe schon einiges versucht, weiss aber nicht mehr weiter.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.06.2003, 11:41 Uhr
virtual
Sexiest Bit alive
(Operator)


Also genau hab ich es nicht gerafft. Deshalb erst mal meine Vermnutung:
Du hast eine Text, der steht in der varaiblen datum_id In diesem text gibt es einzelne Felder, die durch ein Semikolon getrennt sind. Nun scheinst Du irgendwie jeweils die mit dem Semikolon getrennten Felder in andere Felder kopieren zu wollen (zB id). Ist das richtig?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.06.2003, 11:48 Uhr
Hacku



Jo, genau, hab ich erst vergessen mit hinzuschreiben und editieren ging nich...
Also, ich hab in datum_id eine id und ein datum. die sind mit einem semikolon getrennt. ich möchte die id nach id bekommen, kopiere dann in der schleife zeichen für zeichen, wenn das ";" kommt soll er aufhören zu kopieren...das problem ist, er holt nie das letzte zeichen...und ich weiss nicht, wieso!?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.06.2003, 12:51 Uhr
virtual
Sexiest Bit alive
(Operator)


Prinzipiell kann man das auch alles mit vorgefertigten Routinen machen, die C mitbringt:
Folgender - ungetesteter - Code benutzt strchr zum suchen nach dem Semikolon und kopiert dann die Teile links und rechts davon in eigene Puffer.

C++:
#include <stdio.h>

int main()
{
    char test_daten[256] = "Ich bin Eine ID;Ich bin ein Datum";
    char id[256];
    char datum[256];
    char* p;
    /* Vorinitialisieren, nur bei id erfoderlich */
    strcpy(id, "");

    /* Suche das Semikolon */
    p = strchr(test_daten, ';');
    if (NULL == p)
    {
        printf("Oje, kein Semikolon da!\n");
        return 1;
    }

    /* Fülle die Felder mit den Werten */
    strncat(id, test_daten, p-test_daten);
    strcpy(datum, p+1);

    /* Gebe die Daten aus */
    printf("Die ID ist: %s\n", id);
    printf("Das Datum ist: %s\n", datum);
    printf("Die Originaldaten waren: %s\n", test_daten);
}


Schmerzfreier geht es mit der Routine strtok, wobei diese routine dann allerdings die Ausgangsdaten verändert (würde an die Stelle des Semikolons ein 0-Byte schreiben). Da ich mir aber nicht sicher war, was Du genau brauchst, habe ich strchar verwendet; obiger Code läßt die Ausgangsdaten unverändert.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.06.2003, 13:02 Uhr
virtual
Sexiest Bit alive
(Operator)


In C++ sieht es natürlich wieder anders aus, da kommt man vielleicht auf die Idee std::string zu verwenden und dann sich eine tokenizer Klasse zu schreiben. Der Konstructor erwartet als ersten Parameter den zu zerlegenden String und als zweite (optionalen) Parameter die Zeichen, die zur Zerlegung benutzt werden.
main zeigt die Benutzung.

C++:
#include <string>
#include <iostream>
#include <cstdlib>

class tokenizer
{
    std::string delimiter;
    std::string data;
public:
    // ctor
    tokenizer(
        const std::string& data_,
        const std::string& delimiter_ = ":;")
        :data(data_), delimiter(delimiter_) {
    }

    // Do we expect further tokens?
    operator bool () const {
        return data.length()>0;
    }

    // extract next token
    std::string next() {
        std::string r;
        std::string::size_type p = data.find_first_of(delimiter);
        if (std::string::npos!=p)
        {
            r = data.substr(0, p);
            data = data.substr(p+1);
        }else
        {
            r = data;
            data.erase();
        }
        return r;
    }
};


int main()
{
    std::string strPath = std::getenv("PATH");
    std::cout<<"Wir zerteilen PATH="<<strPath<<" in seine einzelnen Pfade:"<<std::endl;

    tokenizer tokens(strPath);
    while (tokens)
    {
        std::cout<<tokens.next()<<std::endl;
    }
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.06.2003, 13:09 Uhr
Hacku



Danke, der code funzt perfekt!!! Vielen, vielen dank...hätt ich selbst nich hinbekommen....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.06.2003, 16:13 Uhr
Hacku



Hallo!
Beim weiterarbeiten hat sich ein neues Problem ergeben...
In der Datei sind mehrere (unterschiedlich lange) Zeilen, jeweils durch \n getrennt. Mein Programm soll nun die Zeilen in richtiger Länge einlesen...!???
Ich habe etwas mit CFile->Seek(...) probiert, aber so richtig klappt es nicht. Kann mir jemand helfen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.06.2003, 18:13 Uhr
virtual
Sexiest Bit alive
(Operator)


Bei CFile kann Ich Dir nicht helfen. Bei normlen C++ schon:
Folgendes liest eine Datei zeilenweise ein:

C++:
#include <iostream>
#include <fstream>
#include <string>

int main()
{
   std::ifstream datei("MeineKleineTextDatei.txt");
   std::string zeile;

   while (getline(datei, zeile))
   {
        // Hier kannst Du was mit der Textzeile machen. zeile.size() ist die Länge der Zeile.
        // Du kannst zb die tokenizer Klasse (siehe oben) benutzen, um die Zeile zu zerstückeln-
   }
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: