Как отобразить определенный набор данных File Handling C - PullRequest
0 голосов
/ 05 февраля 2019

так что я думаю, есть ли способ, которым я мог бы отобразить один набор введенных данных.Итак, мой пример программы работает так: пользователь вводит имя, пол и возраст.Пользователь может ввести несколько данных.Но я хочу добавить функцию, в которой пользователь будет вводить имя, а затем отображать имя, соответствующий ему пол и возраст.Но дело в том, что я понятия не имею, чтобы сделать это.Я слышал о функции fseek(), но я думаю, что она просто редактирует значение;например, возраст или пол.

Вот мой пример кода:

#include <stdio.h>
#include <stdlib.h>

struct clientName {
    char name[30];
    char gender[10];
};

struct clientAge {
    int age;
};

void main() {
    FILE *fp;
    fp = fopen("data.txt", "ab");

    struct clientName NAME;
    struct clientAge AGE;

    if(fp == NULL){
        printf("Error");
        getch();
    } else {
        system("cls");
        printf("Enter Name: ");
        gets(NAME.name);

        printf("Enter Gender: ");
        gets(NAME.gender);

        printf("Enter Age: ");
        scanf("%d", &AGE.age);

        fwrite((char *)&NAME, sizeof(struct clientName), 1, fp);
        fwrite((char *)&AGE, sizeof(struct clientAge), 1, fp);
        printf("\n\nData Added");
        fclose(fp);

     }

     system("cls");
     fp = fopen("data.txt", "rb");

     while((fread((char *)&NAME, sizeof(struct clientName), 1, fp)) == 1 & (fread((char *)&AGE, sizeof(struct clientAge), 1, fp)) == 1) {

         printf("%s", NAME.name);
         printf("       %s", NAME.gender);
         printf("      %d y/o", AGE.age);
         printf("\n");  
    }

    fclose(fp);

}

1 Ответ

0 голосов
/ 05 февраля 2019

Есть пара проблем, которые я вижу с вашим кодом.Сначала я попытаюсь исправить это, а затем приведу полный пример того, как я буду делать то, что вы хотите сделать.

struct clientName {
    char name[30];
    char gender[10];
};

struct clientAge {
    int age;
};

Почему вы используете 2 структуры для 1 набора данных?

Вместо этого используйте

struct data
{
    char name[30];
    char gender[10];
    int age;
};

.

   fwrite((char *)&NAME, sizeof(struct clientName), 1, fp);

можно записать как: fwrite(&client, sizeof(client), 1, fp);

     while((fread((char *)&NAME, sizeof(struct clientName), 1, fp)) == 1 
& (fread((char *)&AGE, sizeof(struct clientAge), 1, fp)) == 1) 

можно записать как: while (fread(&client, sizeof(client), 1, fp))

, после чего вам нужно только сравнить переменную client.name с вашим введенным пользователем именем, например:

    if (strcmp(client.name, input) == 0)

Обратите внимание, что я решил использовать только одну структуру специально, поскольку не понимаю, почему было бы полезно использовать 2 структуры в вашем случае использования.Однако если вам необходимо использовать 2 структуры, вы можете просто добавить к ним целочисленную переменную «ID» и найти все точки данных для любого заданного имени таким образом.

Пример полного кода:

struct data
{
    char name[30];
    char gender[10];
    int age;
};

int main(void)
{
    struct data client;
    FILE* fp;
    char ch = 0;
    do
    {
        printf("Enter Name: ");
        scanf("%s", client.name);

        printf("Enter Gender: ");
        scanf("%s", client.gender);

        printf("Enter Age: ");
        scanf("%d", &client.age);

        fp = fopen("Data.dat", "ab");
        fwrite(&client, sizeof(client), 1, fp);
        fclose(fp);
        printf("continue? \n");
        scanf(" %c", &ch);
    } while (ch != 'n'); // continuously appends file till letter n is read;

    char input[30]; // user input
    printf("name?\n"); // please note that you could pretty much use every other data point here.
    scanf("%s", input);

    struct data Read; // used different for showcasing purposes only
    fp = fopen("Data.dat", "rb");
    while (fread(&client, sizeof(client), 1, fp))
    {
        if (strcmp(client.name, input) == 0) // compare variable with user input
        {
            printf("%s", client.name);
            printf("       %s", client.gender);
            printf("      %d y/o", client.age);
            printf("\n");
        }
    }
    return 0;
}
...