【问题标题】:How to display a certain set of data File Handling C如何显示某组数据文件处理C
【发布时间】:2019-02-05 06:10:59
【问题描述】:

所以我在想是否有一种方法可以显示一组输入的数据。所以我的示例程序是这样运行的: 用户输入姓名、性别和年龄。用户可以输入多个数据。但我想添加一个功能,用户将在其中输入姓名,然后显示姓名,以及相应的性别和年龄。但问题是,我不知道这样做。我听说过一个函数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);

}

【问题讨论】:

  • 现在要学习的第一件事就是正确缩进代码。那是不可读的。第二个是删除所有这些 (char *) 强制转换,它们只会使您的代码更加错误。
  • 另外你的问题是你没有在写入之后关闭文件。 fclose(fp) 在后者阅读之前。

标签: c file-handling


【解决方案1】:

我发现您的代码存在一些问题。我将首先尝试纠正它,然后提供一个完整的例子来说明我将如何做你想做的事情。

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

struct clientAge {
    int age;
};

为什么要为 1 个数据集使用 2 个结构?

使用

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

改为。

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

可以写成:fwrite(&amp;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(&amp;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;
}

【讨论】:

  • 谢谢你,这成功了!但我可以问一个问题吗? struct data Read 上的 Read 是什么?
  • 它是一个不同的数据“对象”,以展示数据是从文件中读取的(认为否则可能不是那么明显)。换句话说,它可以被省略并且可能应该被省略。
猜你喜欢
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多