Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » 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 < [ 2 ]
000
22.11.2008, 12:48 Uhr
~ich
Gast


Hallo

mein Problem ist dass es immer <null> ausgibt. Ich komme aber nicht darauf was falsch ist im Programm.


C++:
    FILE *infile;
    char ppm_code [150];
    char *helppointer;
\\
\\

fgets(ppm_code, 150, infile);

  helppointer=strtok(ppm_code," ");

        while (!feof(infile))
        {
           printf("%s",helppointer);
           helppointer=strtok(NULL," ");
            
        }



MfG

Dieser Post wurde am 22.11.2008 um 15:06 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.11.2008, 20:17 Uhr
0xdeadbeef
Gott
(Operator)


Naja, nun ist das kein vollständiges Programm, und ich kenne deine Eingabedaten nicht, von daher muss ich im Grunde raten. Was mir auffällt, ist, dass du in der Schleife aus der Datei gar nichts mehr liest, und feof(infile) dementsprechend niemals wahr wird - die Schleife läuft also ewig, und wird dann segfaulten, wenn helppointer NULL wird (also strtok fertig ist).

Ich vermute, dass du da eigentlich

C++:
helppointer = strtok(ppm_code, " ");

while(helppointer) {
  printf("%s", helppointer);
  helppointer = strtok(NULL, " ");
}


bzw.

C++:
for(helppointer = strtok(ppm_code, " ");
    helppointer;
    helppointer = strtok(NULL, " "))
{
  printf("%s", helppointer);
}


haben willst. Aber wie gesagt, das ist ein bisschen geraten.

Oh, und wenn dein System POSIX-konform ist, zieh die Benutzung von strtok_r in Betracht - strtok ist nicht threadsicher.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 22.11.2008 um 20:20 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.11.2008, 20:44 Uhr
~ich
Gast


Auf den Fehler mit fgets hätte ich selber kommen können aber ich dachte das es automatisch mit strtok weiter geht bis zum Ende der Datei.

Das ist nur ein Unterprogramm.

Da in meiner Liste nur strtok beschrieben ist, belasse ich es mal bei dieser Funktion.



C++:
infile=fopen(openfile_n,"r");

    if (infile != NULL)
    {

        fgets(ppm_code, 150, infile);
        if (strcmp(ppm_code,"P3\n") !=0)
        {
                 exit(1);
        }
        fgets(ppm_code, 150, infile);
        fgets(ppm_code, 150, infile);
        row = strtol (ppm_code,&pEnd,0);
        lines = strtol(ppm_code+4,&pEnd,0);
        puts(ppm_code);

        fgets(ppm_code, 150, infile);

        helppointer=strtok(ppm_code," ");


        while (!feof(infile))
        {
            fgets(ppm_code, 150, infile);
            helppointer=strtok(NULL," ");
            printf("%s",helppointer);
        }


p.s. Ist es möglich wenn man einen falschen Sicherheitscode eingibt oder den Code vergisst dass es den Text nicht immer löscht. Das macht mich wahnsinnig, ich weiß nicht wie oft mir das passiert ist. Das mit [cpp] muss man das immer eintippen oder geht es auch wenn man es nur anklickt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.11.2008, 22:54 Uhr
0xdeadbeef
Gott
(Operator)


Aaalso, mehrere Anmerkungen zum unteren Teil:

Zum einen wird das eof-Bit des Eingabestroms erst dann gesetzt, wenn über das Ende hinausgelesen wurde, also nachdem fgets einmal fehlgeschlagen ist. Das bedeutet, wenn du durch die Zeilen einer Datei iterieren willst, ist es sehr viel sinnvoller

C++:
while(fgets(ppm_code, 150, infile) {
  // Zeile hier verarbeiten
}


zu schreiben. Zum Anderen merkt sich strtok in einer statischen Variable, wo der letzte Token zuende war, und verwendet diese Stelle beim nächsten mal, wenn ein Aufruf mit NULL geschieht. Deswegen ist die Funktion übrigens auch nicht threadsicher. Das bedeutet aber, dass

C++:
            fgets(ppm_code, 150, infile);
            helppointer=strtok(NULL," ");


ziemlicher Unfug ist. strtok kriegt nicht auf irgendeine magische Weise mit, dass der Inhalt von ppm_code sich geändert hat, und arbeitet im Zweifel mit der vorher gemerkten Stelle weiter. Jedenfalls ist das in der Praxis so, der Standard definiert dafür allerdings kein Verhalten. Verlass dich also nicht darauf.

Wie dem auch sei, wenn die Variable sich ändert, muss strtok sinnvollerweise neu initialisiert werden - also als ersten Parameter die Variable statt NULL kriegen. Das bedeutet, wie oben schon einmal erwähnt:

C++:
for(helppointer = strtok(ppm_code, " ");
    helppointer;
    helppointer = strtok(NULL, " "))
{
  printf("%s", helppointer);
}



Zum dritten frage ich mich, warum du es dir eigentlich so schwer machst. Wenn ich richtig verstehe, was du da vorhast, ließe sich das mit fscanf viel einfacher lösen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.11.2008, 12:54 Uhr
~ich
Gast


Ich habe im letzten Thread fast nur Bahnhof verstanden.

Wieso wird das eof-Bit gesetzt, wird das nicht aus der Datei herausgelesen? Somit wenn das Eof herausgelesen wurde liest es nicht mehr die Zeilen.


C++:
while(fgets(ppm_code, 150, infile)


Was liest es hier raus, braucht es nicht einen Vergleichsoperator?


Bearbeitung:
Zum Anderen merkt sich strtok in einer statischen Variable, wo der letzte Token zuende war, und verwendet diese Stelle beim nächsten mal, wenn ein Aufruf mit NULL geschieht. Deswegen ist die Funktion übrigens auch nicht threadsicher.strtok kriegt nicht auf irgendeine magische Weise mit, dass der Inhalt von ppm_code sich geändert hat, und arbeitet im Zweifel mit der vorher gemerkten Stelle weiter. Jedenfalls ist das in der Praxis so, der Standard definiert dafür allerdings kein Verhalten. Verlass dich also nicht darauf.


Ist mir unklar was du damit sagen wolltest.

Der Inhalt ändert sich ja nicht, ich lese ja einen fixen Code aus der Datei.


C++:
for(helppointer = strtok(ppm_code, " ");
    helppointer;
    helppointer = strtok(NULL, " "))


Wie ist da die Funktion, braucht der zweite helppointer nicht einen Vergleichsoperator.


Bearbeitung:
Zum dritten frage ich mich, warum du es dir eigentlich so schwer machst. Wenn ich richtig verstehe, was du da vorhast, ließe sich das mit fscanf viel einfacher lösen.


Da ich dachte das ist am einfachsten, wenn ich einfach die ganze Zeile einlese und die einzelnen Werte einfach rüberkopiere. Es soll ja auch keine Bildveränderung sein wenn ich einen Wert in einer anderen Zeile usw. habe. Somit wollte ich die Zeile 1:1 rüberkopieren.

Was ist besser oder schlechter an fgets, fgetc oder fscanf bei dieser Funktion.

MfG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.11.2008, 12:59 Uhr
~ich
Gast


Was ich noch vergessen habe zu fragen, kann ich die feof-Funktion mit einer do-while Schleife verwenden damit es nicht rausliest
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.11.2008, 17:39 Uhr
0xdeadbeef
Gott
(Operator)


Wenn du lustig bist, kannst du auch

C++:
while(fgets(ppm_code, 150, infile) != NULL)


schreiben, aber notwendig ist es nicht. Gleichfalls beim anderen Beispiel.

Ansonsten scheint es mir langsam so, als wäre dir nicht ganz klar, was strtok eigentlich macht. Was genau hast du eigentlich zu tun vor?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.11.2008, 18:14 Uhr
~ich
Gast


Ich habe einen Code zb. 123 456 789 123 456 789 123 456 789

Die ersten drei Codes stellen den Farbcode für ein Pixel dar. Wenn der erste und vierte Code einen gewisse Differenz haben soll es das neue Pixel schwarz oder weiß färben.

Ich bin aber jetzt dabei nur einmal den Code auszugeben.

Strtok kopiert den ersten und gibt ihn aus dann den zweiten usw. und später brauch ich den ersten Code um ihm mit dem vierten zu verlgleichen.

Was ich noch vergessen habe ist die calloc oder malloc funktion für den Code

Wie ist das jetzt mit dem feof, den fscanf bzw. fgets usw. oder spielt das keine Rolle mehr
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.11.2008, 18:33 Uhr
0xdeadbeef
Gott
(Operator)


Aaalso, wenn du einfach nur einen Haufen Zahlen einlesen willst, dafür ist fscanf die sinnvollste Variante. Das sieht dann etwa so aus:

C++:
FILE *fd = fopen("datei.txt", "r");
int x;

while(fscanf(fd, "%d", &x) == 1) {
  // Zahl verarbeiten
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 23.11.2008 um 18:34 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.11.2008, 21:51 Uhr
~ich
Gast


Ich habe jetzt den Code eingelesen und habe es geschafft ihn auch wieder in einer anderen Datei auszugeben.

Ich muss jetzt

Wert3=Wert 0 - Wert3
Wert(erster Wert in zweiter Reihe)=Wert 0 - Wert(erster Wert in zweiter Reihe)

Wert4=Wert 1 - Wert4
Wert(zweiter Wert in zweiter Reihe)=Wert 1 - Wert(zweiter Wert in zweiter Reihe)

Wert 5=Wert 2 - Wert5
Wert(dritter Wert in zweiter Reihe)=Wert 2 - Wert(dritter Wert in zweiter Reihe)

Wert6=Wert 3 - Wert6
Wert(vierter Wert in zweiter Reihe)=Wert 3 - Wert(vierter Wert in zweiter Reihe

1xx 2xx 3xx 4xx 5xx 6xx
7xx 8xx 9xx 10xx 11xx 12xx

4=1-4
7=1-7

5=2-5
11=5-11

6=3-6
12=6-12

usw.

realisieren.

Wie könnte ich das Programmieren.



)

C++:
        hilfsp=calloc(reihe*spalte*3,sizeof(int));

        for (i=0;i<reihe*spalte*3;i++)
        {


            fscanf(lesedatei,"%d",&hilfsp[i]);

        }



        for (i=0;i<reihe*spalte*3;i++)
        {


            fprintf(schreibedatei,"%d ",ptr[i]);

        }
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: