2009-12-22 5 views
0

Je lis dans un fichier avec un format similaire à:Comment se fait-il que je reçois des résultats bizarres avec istream :: get (char *, streamsize n, char delim)?

TIME, x, y, z 
00:00:00.000 , 1, 2 , 3 
00:00:00.001 , 2 , 3 , 4 

etc, et un code similaire à ce qui suit:

std::ifstream& istream; 
char buffer[15]; 
double seconds, hours, mins; // initialised properly in real code 

// to read in first column 
istream.get(buffer, 14, ','); 

int scanned = std::sscanf(buffer, "%d:%d:%lf", &hours, &mins, &seconds); 

Il se lit dans la première colonne très bien pour la plupart du temps. Cependant, de temps en temps le sscanf échoue, et quand je vérifie ce qui est dans la mémoire tampon en utilisant le débogueur Codegear je vois qu'il a lu dans \000:00:023 par exemple. Pour une raison quelconque, il collecte un caractère nul, \0, à l'avant. Quand je regarde dans le fichier texte, il semble être le même format que toutes les autres valeurs de temps qui ont été lues correctement. Pourquoi ajoute-t-il parfois un caractère nul? Et y a-t-il un travail autour?

Répondre

2

Vous avez lu une ligne vide ou vous essayez de lire au-delà de la fin du fichier.

Le premier caractère est \0, ce qui signifie la fin de la chaîne.

N'importe quels caractères après cela sont de la mémoire intacte.

+0

Mais il arrive seulement à certaines des valeurs de temps que je lis et la mise en forme est cohérente pour toutes les lignes. Alors pourquoi lit-il une ligne vide? – Seth

+1

Est-ce qu'un éditeur hexadécimal vérifie qu'il n'y a pas de valeurs NULL dans le fichier texte? Êtes-vous en train de vérifier istream.eof()? istream.bad()? istream.fail()? –

+0

Oui - c'était en fait correctement lire la dernière valeur de temps. Cependant, l'erreur se produisait sur la boucle suivante quand elle essayait de lire après la fin du fichier. J'étais confus car le débogueur affichait la dernière valeur lue dans le buffer avec le '\ 0 'en tête de celui-ci. – Seth

2

essayer et voir ..

ifstream inpfile("sample.txt"); 
char buffer[15]; 
inpfile.ignore(80, '\n'); 
while (!inpfile.eof()) 
{ 

    inpfile.get(buffer, 14, ','); 
    int hrs, mins; 
    double secs; 
    hrs = mins = secs = -1; 
    sscanf_s(buffer, "%d:%d:%lf", &hrs, &mins, &secs); 
    cout << "hrs:" << hrs << "\t" 
     << "mins:" << mins << "\t" 
     << "secs:" << secs 
     << endl; 
    inpfile.ignore(80, '\n'); 
} 
0

plus probable que vous avez une virgule de fin dans votre fichier d'entrée quelque part. ou peut-être plus de 14 caractères d'espace après le dernier nombre sur une ligne.