首页 > 解决方案 > 按 ID 在文本文件中搜索名称

问题描述

我有一个包含 2 行的文本文件:

Voicu;卡塔林;1234;2.32

戴安娜;卡达尔;2345;1.01

我试图让我的程序在 .txt 文件中搜索 ID(1234 或 2345)并将其与名称匹配。下面是我尝试制作的代码,但是在我在第一个scanf中写入后它不会在.txt中找到ID,出现的第一件事是“else”行。

    void alegereStudent(struct student *stud)
{

    FILE *scStudenti = fopen("studenti.txt", "a");
    char *error;
    int i=0,n;
    if(scStudenti==NULL)
    {
            error = strerror(errno);
            printf("Fisierul nu poate fi creat: \n %s", error);
    }

    printf("\nIntroduceti Numele: ");
    scanf("%39s", stud->numeStudent);

    printf("Introduceti Prenumele: ");
    scanf("%39s", stud->prenumeStudent);

    printf("Introduceti ID-ul studentului: ");
    scanf("%d", &stud->idStudent);

    printf("Introduceti Media de admitere: ");
    scanf("%f", &stud->medieAdmitere);

    fprintf(scStudenti,"<%s>;", stud->numeStudent);
    fprintf(scStudenti,"<%s>;", stud->prenumeStudent);
    fprintf(scStudenti,"<%d>;", stud->idStudent);
    fprintf(scStudenti,"<%.2f>\n", stud->medieAdmitere);
    fclose(scStudenti);

}

//

 void optiunea_2()
{
    printf("\n1.Despre studenti.\n");
    printf("2.Despre profesori.\n");
    printf("3.Revenire la meniu principal.\n");
    printf("\nAlegeti o optiune: ");
    scanf("%d",&alegere_opt2);

    switch(alegere_opt2)
    {
        case 1: while(&stud!=NULL)

        {

            FILE *scStudenti = fopen("studenti.txt", "r");
            char *error;
            int cautareID;

                if(scStudenti==NULL)
                {
                    error = strerror(errno);
                    printf("Fisierul nu poate fi creat: \n %s", error);
                }

            printf("\nIntroduceti ID-ul studentului: ");
            scanf("%d", &cautareID);
            fscanf(scStudenti,"%d",&stud->idStudent);
            if(cautareID==&stud->idStudent)
            {
            printf("Numele Studentului este %s %s",&stud->numeStudent, &stud->prenumeStudent);
            }
            else
                printf("\nAcest ID nu exista!\n");
                optiunea_2();


        }break;

标签: csearchscanf

解决方案


fprintf(scStudenti,"<%s>;", stud->numeStudent);
fprintf(scStudenti,"<%s>;", stud->prenumeStudent);
fprintf(scStudenti,"<%d>;", stud->idStudent);
fprintf(scStudenti,"<%.2f>\n", stud->medieAdmitere);
fclose(scStudenti);

This makes formatting much more difficult. The output file will contain:

<first>;<last>;<1234>;<0.5>

You want to start with a new file and simplify the output to write:

first;last;1234;0.5

Don't always put & in front of integer. Just use:

if(cautareID == stud->idStudent)
{
...
}

Example:

const char *filename = "studenti.txt";

void alegereStudent()
{
    struct student stud;
    FILE *scStudenti = fopen(filename, "a");
    if(scStudenti == NULL)
    {
        printf("error\n");
        return;
    }

    printf("\nIntroduceti Numele: ");
    scanf("%39s", stud.numeStudent);

    printf("Introduceti Prenumele: ");
    scanf("%39s", stud.prenumeStudent);

    printf("Introduceti ID-ul studentului: ");
    scanf("%d", &stud.idStudent);

    printf("Introduceti Media de admitere: ");
    scanf("%f", &stud.medieAdmitere);

    fprintf(scStudenti, "%s;", stud.numeStudent);
    fprintf(scStudenti, "%s;", stud.prenumeStudent);
    fprintf(scStudenti, "%d;", stud.idStudent);
    fprintf(scStudenti, "%.2f\n", stud.medieAdmitere);
    fclose(scStudenti);
}

void find_by_id(int id)
{
    FILE *fin = fopen(filename, "r");
    if(!fin)
        return;

    int count = 0;
    struct student stud;
    while(fscanf(fin, "%39[^;];%39[^;];%d;%f\n",
        stud.numeStudent, stud.prenumeStudent, &stud.idStudent, &stud.medieAdmitere) == 4)
    {
        if(id == stud.idStudent)
        {
            printf("found %s %s\n", stud.numeStudent, stud.prenumeStudent);
        }
        count++;
    }

    if(count == 0)
        printf("failed to read any record. Start with a new file.\n");
}

int main(void)
{
    alegereStudent();
    find_by_id(1234);
    return 0;
}

If <> characters are added, then read according to that format, you then have to remove the extra <> characters from the string.

void alegereStudent()
{
    struct student stud;
    ...
    fprintf(scStudenti, "<%s>;", stud.numeStudent);
    fprintf(scStudenti, "<%s>;", stud.prenumeStudent);
    fprintf(scStudenti, "<%d>;", stud.idStudent);
    fprintf(scStudenti, "<%.2f>\n", stud.medieAdmitere);    
    fclose(scStudenti);
}

void find_by_id(int id)
{
    ...
    struct student stud;
    while(fscanf(fin, "%39[^;];%39[^;];<%d>;<%f>\n",
        stud.numeStudent, stud.prenumeStudent, &stud.idStudent, &stud.medieAdmitere) == 4)
    {
        if(id == stud.idStudent)
        {
            char *p;
            size_t i;

            //remove the extra <> characters
            p = stud.numeStudent;
            if (strlen(p) > 1)
            {
                for(i = 1; i < strlen(p) - 1; i++)
                    p[i - 1] = p[i];
                p[i - 1] = 0;
            }

            //remove the extra <> characters
            p = stud.prenumeStudent;
            if (strlen(p) > 1)
            {
                for(i = 1; i < strlen(p) - 1; i++)
                    p[i - 1] = p[i];
                p[i - 1] = 0;
            }

            printf("found %s %s\n", stud.numeStudent, stud.prenumeStudent);
        }
        count++;
    }

    if(count == 0)
        printf("failed to read any record. Start with a new file.\n");
}

推荐阅读