Поиск имени в текстовом файле по идентификатору - PullRequest
0 голосов
/ 21 октября 2018

У меня есть текстовый файл с двумя строками:

Voicu; Catalin; 1234; 2,32

Diana; Cadar; 2345; 1,01

Я пытаюсьчтобы моя программа искала в файле .txt идентификатор (1234 или 2345) и сопоставил его с именем.Ниже приведен код, который я пытался создать, но он не найдет идентификатор в .txt после того, как я напишу его в первом scanf, первое, что появляется, это строка «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;

Ответы [ 2 ]

0 голосов
/ 22 октября 2018
fprintf(scStudenti,"<%s>;", stud->numeStudent);
fprintf(scStudenti,"<%s>;", stud->prenumeStudent);
fprintf(scStudenti,"<%d>;", stud->idStudent);
fprintf(scStudenti,"<%.2f>\n", stud->medieAdmitere);
fclose(scStudenti);

Это значительно затрудняет форматирование.Выходной файл будет содержать:

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

Вы хотите начать с нового файла и упростить вывод до записи:

first;last;1234;0.5

Не всегда ставьте & передцелое число.Просто используйте:

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

Пример:

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

Если добавлено <> символов, затем читать в соответствии с этим форматом, затем вам нужно удалить лишние <> символы из строки.

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");
}
0 голосов
/ 21 октября 2018
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char const *filename = "test.txt";
    FILE *input = fopen(filename, "r");
    if (!input) {
        fprintf(stderr, "Couldn't open \"%s\" for reading!\n\n", filename);
        return EXIT_FAILURE;
    }

    char name[101];
    char surname[101];
    int id;
    double value;
    while (fscanf(input, "%100[^;];%100[^;];%d;%lf%*[\n]", name, surname, &id, &value) == 4) {
        if (id == 2345) {
            printf("Found \"%s %s\" by id %d\n\n", name, surname, id);
            break;
        }
    }
}
...