Comment écrire un programme C pour saisir un nombre à partir du clavier et le stocker dans un fichier texte appelé number.dat . Si le numéro existe dans le fichier, affichez un message d'erreur. Le programme doit permettre de saisir des nombres jusqu'à ce que l'utilisateur saisisse -99 .
J'ai essayé cette question, mais je n'ai pas trouvé comment vérifier si l'entier existe déjà dans le fichier.
Voici ma réponse en code C:
#include <stdio.h>
int main(void) {
int num;
FILE *xPtr;
xPtr = fopen("number.dat", "a");
while (num = -99) {
printf("Enter a number : ");
scanf("%d", &num);
if (num == -99)
break;
fprintf(xPtr, "%d\n", num);
}
return 0;
}
3 Réponses :
Il y a quelques choses qui pourraient être améliorées. Tout d'abord, votre boucle while utilise un opérateur d'affectation pour l'expression conditionnelle:
#include <stdio.h>
int has_num(FILE* file, int num)
{
int curr;
int fnd = 0;
while (!fnd && (fscanf(file, "%d\n", &curr) != EOF))
{
fnd = (curr == num);
}
return fnd;
}
int main(void)
{
int num;
FILE *xPtr ;
do
{
xPtr = fopen("number.dat", "a+");
printf("Enter a number : ");
scanf("%d", &num);
if (num != -99 && !has_num(xPtr,num))
{
fprintf(xPtr, "%d\n", num);
}
fclose(xPtr);
} while (num != -99);
return 0;
}
Au lieu de l'attribuer à 99 au début de la boucle à chaque fois, vous pouvez faire ceci: p>
if (num != -99 && !has_num(xPtr,num))
{
fprintf(xPtr, "%d\n", num);
}
Puisque vous voulez que le bloc à l'intérieur de la boucle s'exécute lorsque num n'est pas égal à -99. Je le convertirais également en une boucle do-while, puisque vous n'attribuez pas num avant d'entrer dans la boucle la première fois. Lorsque vous êtes dans la boucle, vous devriez ouvrir et fermer le fichier afin qu'il puisse garder une trace de tous les nombres que vous ajoutez. Afin de vérifier votre fichier, vous devrez lire ET ajouter, il est maintenant configuré pour uniquement ajouter. Pour lire et ajouter, vous ferez ce qui suit:
xPtr = fopen("number.dat", "a+");
Il peut être utile d'ajouter une fonction appelée has_num ou tout ce que vous choisissez, qui prend le FILE * et recherche un int renvoyant 1 s'il est trouvé et 0 sinon. Vous allez donc modifier votre instruction if pour qu'elle soit
while(num != -99)
Donc, avec toutes ces modifications, votre code deviendra
while(num = -99)
p >
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp; //create a pointer to FILE
char c,n,num;
printf("Enter a Number : ");
scanf("%c",&n);
if(n== -99){
// printf("Enter number greater than -99");
exit(0);
}
else{
fp = fopen("numbers.dat", "r+"); //read file
while ((c = getc(fp)) != EOF) {
num = c;
if(num==n){
printf("Included Number");
exit(0);
}
}
fp = fopen("numbers.dat","w+"); //write new number to file
putc(n, fp);
}
}
scanf ("% c", & n); ne lit pas un nombre, mais simplement un seul caractère.
Votre programme devrait réussir à ajouter les nombres saisis par l'utilisateur au fichier, mais il a quelques problèmes:
fopen () a réussi à ouvrir le fichier, vous avez un comportement non défini si fopen () renvoie NULL . li>
scanf () a rencontré un échec d'entrée. Entrer un caractère qui n'est pas un nombre entraînera un comportement indéfini, très probablement une boucle infinie ajoutant le nombre précédemment entré le cas échéant. Pour le dernier problème, vous devez fopen () le fichier à la fois en lecture et en écriture, rembobiner le fichier et lire toutes les lignes, en vérifiant si le nombre est présent. p >
Voici une version modifiée:
#include <stdio.h>
int main(void) {
int c, num, num1, found;
FILE *xPtr = fopen("number.dat", "w+");
if (xPtr == NULL) {
printf("cannot open file number.dat\n");
return 1;
}
for (;;) {
printf("Enter a number: ");
if (scanf("%d", &num) != 1) {
if (feof(stdin))
break;
printf("invalid input\n");
while ((c = getchar()) != EOF && c != '\n')
continue;
if (c == EOF)
break;
} else {
if (num == -99)
break;
rewind(xPtr);
found = 0;
for (;;) {
/* skip all characters that cannot start a number */
if (fscanf(xPtr, "%*[^-+0-9]") == EOF)
break;
if (fscanf(xPtr, "%d", &num2) == 1) {
if (num == num2) {
found = 1;
break;
}
} else {
getc(xPtr); // consume a byte
}
}
if (found) {
printf("number is already in the file\n");
} else {
/* append the number */
fseek(xPtr, 0L, SEEK_END);
fprintf(xPtr, "%d\n", num);
}
}
}
fclose(xPtr);
return 0;
}
Vous devrez soit 1) lire tous les numéros du fichier une fois au début, puis vérifier le nouveau numéro par rapport à celui-là ou 2) chaque fois que l'utilisateur entre un numéro, puis relire le fichier entier ligne par ligne à la recherche le numéro qu'ils ont entré.
Pouvez-vous s'il vous plaît corriger mon code c
Bienvenue, ScottRyder ... ce n'est pas comme ça que ça marche ici. De quoi avez-vous besoin pour les instructions de @ Rup? Avez-vous compris ses deux suggestions?
Bienvenue à SO! " Comment poser des questions sur les devoirs et y répondre? " est une discussion importante. Que vous travailliez sur un devoir scolaire ou un tutoriel, il est important de résoudre le problème vous-même. Ce processus vous apprend des leçons importantes pour la programmation en général. Sachez également que s'il s'agit d'un devoir scolaire, de nombreuses écoles et enseignants sont au courant de la SO et vérifient si les élèves demandent des réponses ici; Si l'école ou le professeur a des règles contre cela, vous pourriez avoir des problèmes.
@ScottRyder: vous pouvez accepter l'une des réponses en cliquant sur la coche grise sous son score.