该程序应该显示一个菜单,并且用户可以通过选择指定的数字来进行选择。
程序运行良好,但是在读取文件内容时,它会以一些cryptec符号开头,然后显示文件内容。 我尝试了所有解决方案,例如对文件使用其他重做功能,但结果相同
为什么显示这些符号?他们来自哪里?
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
//functions protoype
void Menu(FILE *file);
void Add_Number(FILE*file);
void Show_Numbers(FILE *file);
void Search_Number(FILE *file);
//Define a struct
typedef struct {
char firstName[20];
char lastName[20];
unsigned long number ;
}person;
//Main program
int main()
{
FILE *file = NULL;
//file = fopen("contacts.txt", "a+");
Menu(file);
return 0;
}
void Add_Number(FILE *file)
{
person newUser;
file = fopen("contacts.txt", "a");
if (file != NULL)
{
printf("NOM:\n");
scanf("%s",newUser.firstName);
fflush(stdin);
printf("Prenom:\n");
scanf("%s",newUser.lastName);
fflush(stdin);
printf("Numero:\n");
scanf("%lu",&(newUser.number));
fflush(stdin);
fprintf(file, "\n%s\t%s\t%lu", newUser.firstName, newUser.lastName, newUser.number);
fflush(stdin);
printf("Success");
}
else
{
printf("Erreur d'ouverture de fichier");
exit(-1);
}
fclose(file);
}
void Show_Numbers(FILE*file)//FILE *file)
{
person user;
char s[100];
file = fopen("contacts.txt", "a+");
printf("%s", user.firstName);
if (file != NULL)
{
fseek(file,1,0);
while (fgets(s,1000,file)!=NULL)
{
printf("%s",s);
}
//while (fgets(test, 100, file) != NULL /*EOF*/) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
/* {
printf("%s\n", test); // On affiche la chaîne qu'on vient de lire
}*/
fclose(file);
/*
fg(file, "%s %s %lu\n", test);//, user.lastName, user.number);
printf("Nom: %s\t\t", test);//user.firstName);
// printf("Prenom: %s\t\t", user.lastName);
// printf("Numero: %lu\n", user.number);*/
}
else
{
printf("Erreur d'ouverture de fichier");
exit(-1);
}
fclose(file);
}
void Search_Number(FILE *file)
{
file = fopen("contacts.txt", "a+");
char userToFined[20];
person user;
//test if file not NULL
if(file != NULL)
{
//input
puts("saisir le numero a chercher\n");
gets(userToFined);
//read from the begging
rewind(file);
do
{
fscanf(file, "%s %s %lu", user.firstName, user.lastName, &user.number);
}
while (user.firstName != userToFined && !feof(file));
if(user.firstName == userToFined)
{
printf("Success ! %s est trouve\n", user.firstName);
printf("Son est prenom: %s\t\t", user.lastName);
printf("Son numero est: %lu\n", user.number);
}
else
{
printf("%s est introuvable", userToFined);
}
}
else
{
printf("Erreur d'ouverture de fichier");
exit(-1);
}
fclose(file);
}
void Menu(FILE *file)
{
int choice;
do
{
puts("\n************************************************************\n\t\t BIENVENUE \t\t\n************************************************************");
puts("\t \t **Choisir votre choix**\t \t\n");
puts("---1--- Ajouter un nouveau contact\n");
puts("---2--- Afficher le repertoire\n");
puts("---3--- rechercher un numero\n");
puts("---4--- Ajouter un nouveau contact\n");
puts("Votre Choix:");
scanf("%d", &choice);
switch (choice)
{
case 1:
Add_Number(file); // Add user
break;
case 2:
Show_Numbers(file); //Show repository
break;
case 3:
Search_Number(file); //Search User
break;
case 4:
exit(0);
break;
default:
printf("Choix Invalid");
break;
}
} while (choice != 4);
}
答案 0 :(得分:1)
函数Show_Numbers()
有很多问题:
void Show_Numbers(FILE*file) //<<< WHY IS file AN ARGUMENT?
{
person user; // <<<< DELETE THIS
char s[100];
file = fopen("contacts.txt", "a+"); // <<<< OPEN FOR READ-ONLY
printf("%s", user.firstName); // <<<< DELETE THIS
变量user
进行了单位化,然后仅在尝试打印初始化值时使用。因此,标有两行的内容毫无用处,是造成垃圾输出的原因。
该文件已打开以进行追加,但从未写入。
如果在本地打开和关闭文件,则将file
作为参数传递毫无用处。使用:
FILE* file = fopen( "contacts.txt", "r" ) ;
相反,不传递任何参数。
然后再来
: while (fgets(s,1000,file)!=NULL)
{
printf("%s",s);
}
您正在将1000个字符的块读入100个字符的数组。
最后但不是很关键的一点,在该函数结束时,您不必要地关闭了该函数中早先已关闭的文件。
fclose(file);
}
答案 1 :(得分:0)
user.firstName
在打印时未在Show_Numbers
中初始化。访问未初始化的内存是未定义的行为。在这种情况下,您的程序会将这些内存地址中的任何值解释为字符串,然后将其打印出来。恰好是“×Í=ÿp■`”。
person user;
printf("%s", user.firstName); // uninitialized, may print garbage
此外,fgets(s,1000,file)
可能会在缓冲区外部写入。 s
只有100个字符,而不是1000个字符。