如何在 C 中查找特定记录?
How can I look for a specific record in C?
我正在做一个程序,我可以将游戏添加到列表并显示该列表,但现在我想添加一个功能,允许我写一个游戏的名称并在该列表中搜索它,如果找到显示它的信息。
到目前为止,这是我的代码。
PS:我没有包含 main,因为它不允许我 post 这个问题,因为代码太多
struct defJogo {
char nome[100];
int horasJogadas;
char DiaJogado[50];
};
void inserir(){
struct defJogo JogoAGuardar;
FILE *fJogo;
fJogo = fopen(FileJogos, "rb+");
if (!fJogo) {
fJogo = fopen(FileJogos, "wb");
fclose(fJogo);
fJogo= fopen(FileJogos, "rb+");
}
printf("\n----------NOVO JOGO------------\n");
printf("Nome:");
fflush(stdin);
gets(JogoAGuardar.nome);
printf("Horas Jogadas:");
fflush(stdin);
scanf("%d", &JogoAGuardar.horasJogadas);
printf("Ultimo dia Jogado:");
fflush(stdin);
gets(JogoAGuardar.DiaJogado);
fseek(fJogo, 0, SEEK_END);
fwrite (&JogoAGuardar, 1, sizeof(struct defJogo), fJogo);
fclose(fJogo);
}
void listar(){
struct defJogo JogoAGuardar;
FILE *fJogo ;
fJogo = fopen(FileJogos, "rb+");
if (fJogo) {
fseek(fJogo, 0, SEEK_SET);
int EOFEncontrado = 0;
float mediaHoras = 0;
int contador = 0;
while (EOFEncontrado == 0) {
fread(&JogoAGuardar, 1, sizeof(struct defJogo), fJogo);
if(feof(fJogo)) {
EOFEncontrado = 1;
}
else {
printf("Registo: %s foi jogado %d horas e jogado no pela ultima vez no dia %s\n",
JogoAGuardar.nome, JogoAGuardar.horasJogadas, JogoAGuardar.DiaJogado);
mediaHoras += JogoAGuardar.horasJogadas;
contador++;
}
}
if (contador > 0) {
mediaHoras = mediaHoras/contador;
printf("Numero de Jogos: %d tem media de horas jogadas~por jogo %f\n",
contador, mediaHoras);
}
fclose(fJogo);
}
else {
printf("Ficheiro inexistente... deve criar pelo menos um registo\n");
}
getch();
return 0;
}
您只需将每个 JogoAGuardar.nome
与名称进行比较并跳过不匹配的条目。您可以通过将其定义更改为 listar(char *name)
(以便能够传递名称)并插入行
来轻松扩展 listar()
函数来执行此操作
else if (name && strcmp(JogoAGuardar.nome, name) != 0) continue;
之前
else {
printf("Registo: %s foi jogado %d horas e jogado no pela ultima vez no dia %s\n",
没有搜索的旧行为调用listar(NULL)
。
我正在做一个程序,我可以将游戏添加到列表并显示该列表,但现在我想添加一个功能,允许我写一个游戏的名称并在该列表中搜索它,如果找到显示它的信息。 到目前为止,这是我的代码。 PS:我没有包含 main,因为它不允许我 post 这个问题,因为代码太多
struct defJogo {
char nome[100];
int horasJogadas;
char DiaJogado[50];
};
void inserir(){
struct defJogo JogoAGuardar;
FILE *fJogo;
fJogo = fopen(FileJogos, "rb+");
if (!fJogo) {
fJogo = fopen(FileJogos, "wb");
fclose(fJogo);
fJogo= fopen(FileJogos, "rb+");
}
printf("\n----------NOVO JOGO------------\n");
printf("Nome:");
fflush(stdin);
gets(JogoAGuardar.nome);
printf("Horas Jogadas:");
fflush(stdin);
scanf("%d", &JogoAGuardar.horasJogadas);
printf("Ultimo dia Jogado:");
fflush(stdin);
gets(JogoAGuardar.DiaJogado);
fseek(fJogo, 0, SEEK_END);
fwrite (&JogoAGuardar, 1, sizeof(struct defJogo), fJogo);
fclose(fJogo);
}
void listar(){
struct defJogo JogoAGuardar;
FILE *fJogo ;
fJogo = fopen(FileJogos, "rb+");
if (fJogo) {
fseek(fJogo, 0, SEEK_SET);
int EOFEncontrado = 0;
float mediaHoras = 0;
int contador = 0;
while (EOFEncontrado == 0) {
fread(&JogoAGuardar, 1, sizeof(struct defJogo), fJogo);
if(feof(fJogo)) {
EOFEncontrado = 1;
}
else {
printf("Registo: %s foi jogado %d horas e jogado no pela ultima vez no dia %s\n",
JogoAGuardar.nome, JogoAGuardar.horasJogadas, JogoAGuardar.DiaJogado);
mediaHoras += JogoAGuardar.horasJogadas;
contador++;
}
}
if (contador > 0) {
mediaHoras = mediaHoras/contador;
printf("Numero de Jogos: %d tem media de horas jogadas~por jogo %f\n",
contador, mediaHoras);
}
fclose(fJogo);
}
else {
printf("Ficheiro inexistente... deve criar pelo menos um registo\n");
}
getch();
return 0;
}
您只需将每个 JogoAGuardar.nome
与名称进行比较并跳过不匹配的条目。您可以通过将其定义更改为 listar(char *name)
(以便能够传递名称)并插入行
listar()
函数来执行此操作
else if (name && strcmp(JogoAGuardar.nome, name) != 0) continue;
之前
else {
printf("Registo: %s foi jogado %d horas e jogado no pela ultima vez no dia %s\n",
没有搜索的旧行为调用listar(NULL)
。