C,文件输出在输出的开头显示加密的图像?

时间:2019-04-26 20:47:07

标签: c

该程序应该显示一个菜单,并且用户可以通过选择指定的数字来进行选择。

程序运行良好,但是在读取文件内容时,它会以一些cryptec符号开头,然后显示文件内容。 我尝试了所有解决方案,例如对文件使用其他重做功能,但结果相同

为什么显示这些符号?他们来自哪里?

The image below explain the encryptec symbols in the begining of the output

#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);
}

2 个答案:

答案 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个字符。