J'ai un fichier de processus.txt contenant des détails sur les processus entrants,
char c; int count = 0; // fp is the pile pointer for (c = getc(fp); c != EOF; c = getc(fp)) if (c == '\n') // Increment count if this character is newline count = count + 1;
3 Réponses :
Peut-être que votre fichier est à la fin ou en erreur lorsque vous faites cela ?? Et vous devez commencer au début
Ou il n'a tout simplement pas coché le statut de retour fopen (3) code> et tente d'essayer
fgetc. (null) code> à la place. Qui sait?
Outre le Ceci fonctionne: p> Toutefois si la dernière ligne du fichier ne se termine pas avec un Char code> qui devrait être un
int code> Votre code est plus ou moins bien. Le problème est quelque part dans le code que vous n'avez pas montré.
\ n code>, il n'est pas compté. p> p>
S'il vous plaît, lisez Comment créer un exemple minimal, complet et vérifiable .
afin de tester Votre émission de programme, j'ai d'abord dû compléter votre fragment de code afin de le rendre compilable. Probablement votre erreur est passée avec cette modification, comme mon exécution indique (sur votre texte d'entrée) cette sortie: p>
et en cours d'exécution: p> quelle est la réponse correcte. P> Malgré cela, votre fragment de programme montre une erreur non visible em >, comme vous l'avez dit dans les commentaires de votre question: Type de parce que vérifier la documentation de Lorsque le programme lit un caractère, il est mappé dans les valeurs dans les deux cas ci-dessus, si un octet avec la même valeur mappée em> de Votre programme final (corrigé) serait le suivant: P> C CODE> La variable doit être
int code> et non
char code>, mais pourquoi?
char code> est le type que vous souhaitez recevoir, toutes les valeurs disponibles sont possibles, afin d'indiquer que
EOF code> n'est pas une de ces valeurs, mais une condition spéciale) une valeur supplémentaire est nécessaire em>, donc en faisant le type
Char code> insuffisante pour inclure toutes les valeurs de retour possibles de
Fgec (3) code>. C'est la raison pour faire fonctionner
fgetc. 3) code> pour renvoyer un
int code>. P>
Fgec (3) Code> Comme votre programme fonctionne presque bien, alors que vous devez avoir une raison de savoir pourquoi: p>
int code>
0 code> à
255 code>, de sorte que tous les octets différents convertissent comme des valeurs entières positives, tandis que normalement (presque chaque implémentation le fait)
EOF code> est mappé dans la valeur entière
-1 code>. Ce qui se passe ici, c'est que toutes vos valeurs sont converties en un
char code>, rendant
eof code> pour être mappé dans l'un de ces
0 code> à
256 code> valeurs strong> (lequel dépend de la mise en œuvre, mais c'est normalement la valeur
255 code> --- ou
-1 code> si
Char CODE> arrive à être signé) Donc: P>
Char code> est représenté sous la forme d'un type de complément de deux (
signé code>) vos valeurs
0 code> à
255 code > sont mappés dans
0 code> à
127 code> et
-128 code> à
-1 code> et le
eof code> la valeur est mappée sur certains d'entre eux (principalement
-1 code>). li>
Char code> est représenté sous la forme d'un type non signé, vos valeurs
0 code> à
255 code> sont mappées dans
0 Code> to
255 code> et la valeur code> EOF code> est mappé sur l'un d'entre eux (le plus probablement
255 code>) li>
EOF code> est converti en, car vous faites votre comparaison dans un système de type cohérent, donc le converti em>
char Code> La valeur est comparée à la valeur convertie em>
EOF CODE> La valeur "CODE> EOF code> est convertie en la valeur convertie de
EOF code>. Mais cela rend une autre valeur code> Char code> pour montrer le même comportement, ce qui rendrait l'une de ces caractéristiques d'entrée de ce type d'entrée, comme
EOF code> et permettra à votre programme de s'arrêter prématurément. li>
ul>
EOF code> est entrée, votre programme finira, croyant qu'il a atteint la fin du fichier et votre compte sera erroné. Ce n'est pas le cas ici, mais vous pouvez obtenir une surprise avec un fichier qui a un tel caractère. P>
#include <stdio.h>
int main()
{
int c;
long count = 0;
FILE *fp = stdin; /* probably you dont have intialized this
* field in your code, but who knows, if
* you have not posted a complete
* sample */
// fp is the pile pointer
while ((c = getc(fp)) != EOF)
if (c == '\n') // Increment count if this character is newline
count++; // this is another frequently used idiom :)
printf("%d\n", count);
return 0;
}
c code> doit être b>
int code>
Depuis le
EOF code> est
int code> (sa valeur étant
0xffffffff code>).
@pmg Je reçois toujours une valeur de 0 pour le nombre de lignes même après avoir changé le
char c code> sur
int C code>
Avez-vous fait autre chose avec votre fichier après l'avoir ouvert? Comme @PMG pointe sur Cette réponse , le pointeur de fichier ne peut pas être au début du fichier dans ce cas.
Avez-vous essayé de marcher dans votre code dans un débogueur? Ou commentant le
si code> - cela change-t-il le résultat?
Sur vous en cours d'exécution sur la plate-forme Linux ou Windows? Pouvez-vous ouvrir votre fichier texte dans un éditeur hexadécimal et confirmer qu'il existe en effet un caractère 0xa dans le fichier pour la nouvelle ligne?
Montrer un exemple reproductible minimal , peut-être que le fichier n'était pas correctement ouvert ou que vous avez fait d'autres choses avant le code que vous avez spectacle, qui sait.