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?
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
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()? –
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