2010-06-28 7 views
0

je le programme suivant,question de lecture du fichier en C++

int iIndex=0; 
char cPort[5]={"\0"}; 
char cFileChar; 
fopen_s(&fFile,"c:\\Config\\FileName.txt","r"); 
if(fFile !=0) 
{ 
    cFileChar = getc(fFile); 
    while (cFileChar!= EOF) 
    { 
    cPort[iIndex]=cFileChar; 
    iIndex++; 
    cFileChar = getc(fFile); 
    } 
iDIPort=atoi(cPort); 
} 

dans le fichier que j'ai 32000, mais lorsque le programme exécute et lire à partir du fichier quelque temps sa lecture fine et mis iDIPort à 32000, mais parfois il définir la valeur de la variable à 320000.

Veuillez m'aider à régler ce problème.

+0

Est-ce le code actuel? Si c'est le cas, il n'est pas clair comment cela pourrait fonctionner, car cFileChar ne change jamais. En outre, il ressemble à C, pas C++? –

+0

Votre code semble un peu étrange. 'cFileChar' n'est jamais modifié à l'intérieur de la boucle, donc le contenu de la boucle sera soit zéro ou infini, selon la valeur initiale de' cFileChar'. De plus, l'initialisation 'char cPort [5] = {" \ 0 "};' ne me semble pas juste. – Philipp

+0

Maintenant, vérifiez le code. – Siddiqui

Répondre

5

Vous écrivez les 5 caractères dans la matrice cPort. C'est bon. Mais alors, vous utilisez cPort comme paramètre de la fonction atoi. Cette fonction attend une chaîne C à terminaison nulle en tant qu'argument. Comme votre variable cPort n'a pas d'espace pour stocker ce char-valeur-zéro pour indiquer la fin de la chaîne, votre code dépend de ce qui est juste après la variable cPort en mémoire. La solution la plus simple pour résoudre votre problème consiste à définir cPort comme un tableau de 6 caractères et à affecter 0 à cPort[5] avant d'appeler atoi. Mais cela ne résoudra pas les autres problèmes de votre code, le principal étant de ne pas vérifier si le nombre que vous avez lu dans le fichier comporte plus de 5 chiffres.

+0

OK Merci Didier. Cela a été résoudre mon problème. – Siddiqui

0

D'accord avec Didier Trosset.

Autre remarque: dans la boucle while, vous vérifiez réellement la variable cFileChar pour la première fois avant de lui attribuer une valeur valide. Votre programme peut donc vous surprendre une fois de plus.

Vous devez l'initialiser à une certaine valeur (autre que EOF) ou la remplacer par do - while.

+0

En fait, c'est la partie du programme juste pour la démonstration. – Siddiqui

0

Ce programme est un peu désastreux. Changer le tableau cPort à la longueur 6 est très bien, mais que faire si quelqu'un met quelque chose de plus dans FileName.txt? Vous avez vous-même un débordement de tampon instantané et un problème majeur de sécurité.

Si vous prévoyez de lire un maximum de 5 caractères, assurez-vous que le programme ne lit pas plus de 5 caractères. Cela signifie terminer la boucle while avant que EOF soit atteint, si nécessaire.

Un autre problème est que vous ne vérifiez pas que les caractères du fichier correspondent à vos attentes. Que faire s'il ne contient pas de nombres?