如何显示某组数据 File Handling C
How to display a certain set of data File Handling C
所以我在想是否有一种方法可以显示一组输入的数据。所以我的示例程序是这样运行的:
用户输入姓名、性别和年龄。用户可以输入多个数据。但我想添加一个功能,让用户输入姓名,然后显示姓名及其对应的性别和年龄。但问题是,我不知道要那样做。我听说过函数 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);
}
我发现您的代码存在一些问题。我将首先尝试更正它,然后提供一个完整的示例,说明我将如何做你想做的事。
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(&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;
}
所以我在想是否有一种方法可以显示一组输入的数据。所以我的示例程序是这样运行的:
用户输入姓名、性别和年龄。用户可以输入多个数据。但我想添加一个功能,让用户输入姓名,然后显示姓名及其对应的性别和年龄。但问题是,我不知道要那样做。我听说过函数 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);
}
我发现您的代码存在一些问题。我将首先尝试更正它,然后提供一个完整的示例,说明我将如何做你想做的事。
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(&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;
}