2016-11-12 2 views
0

Ich versuche, eine Datei mit fgets zu lesen und es mit strtok zu token, aber irgendwie verliere ich den letzten Buchstaben des ersten Tokens (Titel). Ich habe versucht, für eine Weile, das zu beheben, aber es scheint nicht zu tun, dass jede Hilfe geschätzt wird. Ich habe zwar ein Char vor dem Trennzeichen hinzugefügt, aber ich bin mir nicht sicher, wie ich das implementieren soll.Strtok löscht das letzte Zeichen vor dem Delimiter

char line[201]; 
char *title; 
int year; 
char *age; 
char *genre; 
int lenght; 
float rating; 
while ((fgets(line,sizeof(line),fp)) != NULL){ 
    strtok(line,"\""); 
    title = line; 
    year = atoi(strtok(NULL,",")); 
    age = strtok(NULL,","); 
    memmove(age, age+1, strlen(age)); 
    genre = strtok(NULL,","); 
    memmove(genre, genre+1, strlen(genre)); 
    lenght = atoi(strtok(NULL,",")); 
    rating = atof(strtok(NULL,",")); 
    x = new_film(title,year,age,genre,lenght,rating); 
    Insert(root, x); 
} 

Dateidaten wie folgt aussehen:

"Zwei glorreiche Halunken", 1966, "Approved", "West", 161,8.9 "Memento", 2000, R " “, "Mystery/Thriller", 113,8.5

Ausgabe sieht wie folgt aus:

der Gute, der Böse und der Ugl, 1966, GENEHMIGT, Western, 161,8.9

+1

Kann nicht aus dem angezeigten Code reproduzieren (obwohl es in einigen unerwünschten '' 'Marken). Es muss in dem Code sein, den Sie nicht angezeigt haben. Zum Beispiel bekomme ich "Das Gute, das Schlechte und das Hässliche", also meine Vermutung ist, dass eine dieser Funktionen versucht, die Zitate zu entfernen, die bereits entfernt wurden. –

+0

Ihre Verwendung von 'strtok' ist schrecklich - Sie überprüfe nie seinen Rückgabewert, und du ignorierst seinen ersten Rückgabewert - deshalb beginnen deine Titel mit "". Und die ganze fiese Saite, die sich verschiebt? –

+0

'strtok (line," \ ""); titel = zeile; '->' title = strtok (zeile, "\" ";' – BLUEPIXY

Antwort

1

Sie haben eine Verwirrung den retu zu ignorieren rn Wert von strtok und versuchen, die Saiten zu fiedeln, die es trennt. Ich schlage vor, diese (obwohl Sie immer für schlechte Datenformatierung überprüfen sollten, zum Beispiel wenn strtok kehrt NULL):

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char line[201]; 
    char *title; 
    int year; 
    char *age; 
    char *genre; 
    int lenght; 
    float rating; 
    while ((fgets(line,sizeof(line),stdin)) != NULL){ 

     title = strtok(line, "\"");     // use this value 
     year = atoi(strtok(NULL, "\",\n"));   // added delimiters 
     age = strtok(NULL, "\",\n"); 
     genre = strtok(NULL, "\",\n"); 
     lenght = atoi(strtok(NULL, "\",\n")); 
     rating = (float)atof(strtok(NULL, "\",\n")); 

     printf("%s\n", title); 
     printf("%d\n", year); 
     printf("%s\n", age); 
     printf("%s\n", genre); 
     printf("%d\n", lenght); 
     printf("%f\n", rating); 
     printf("\n"); 
    } 
    return 0; 
} 

Programmausgabe:

The Good, the Bad and the Ugly 
1966 
APPROVED 
Western 
161 
8.900000 

Memento 
2000 
R 
Mystery/Thriller 
113 
8.500000 
+0

Eigentlich war das Problem in meiner neuen Strukturfunktion, als ich die Saite trotzdem kopierte, vielen Dank hätte ich wahrscheinlich ziemlich viel Zeit verschwendet, um das zu finden –

0

Anmerkung: die ‚title‘ eine führende Trennzeichen hat,

Sie sollten sehr vorsichtig sein, wenn das nächste zu prüfende Zeichen ein Trennzeichen ist.

Wir schlagen dringend vor, immer ein Trennzeichen von , (Komma) für Ihre aktuelle Daten Beispiel verwenden.

Wenn Sie möchten (später) entfernen Sie alle `` "` (doppelte Anführungszeichen), dann die umliegenden doppelten Anführungszeichen werden noch da sein, und leicht entfernt werden können.

Lets nicht vergessen, dass strtok() das Trennzeichen mit einem ersetzt NUL-Byte, so dass der erste Aufruf (im geposteten Code) an strtok() das nachfolgende doppelte Zitat getrimmt hat

Verwandte Themen