gpt4 book ai didi

C - 功能没有执行?

转载 作者:太空宇宙 更新时间:2023-11-04 04:37:50 25 4
gpt4 key购买 nike

1. 和 3. 菜单项有效,但如果我选择 2. 菜单项,它不会列出我的数据。这是为什么?(必须在linux命令行下编译运行[NO IDE!])

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>

struct log{
int id;
char name[20];
char location[20];
int quantity;
char quantity_type[10];
time_t added;
};

char fname[] = "data2.dat";

void add();
void listAll();

int nextId();

int main(){
int ch;

while(1){
system("clear");

printf("///Log stuff!///\n\n");

printf("1. Add\n");
printf("2. List all\n");
printf("0. Exit\n");

printf("\n///////////////////////////////\n\n");

printf("Choose a number from the menu: ");
scanf("%d", &ch);

switch(ch){
case 1: add();
break;

case 2: listAll();
break;

case 0: exit(0);
break;
}
}

return 0;
}

void add(){
FILE *f;
struct log log;

f = fopen(fname, "ab");
if(f == NULL){perror("Can't open!\n");}

log.id = nextId();
printf("\nName: ");
scanf("%s", log.name);
printf("\nLocation: ");
scanf("%s", log.location);
printf("\nQuantity: ");
scanf("%d", &log.quantity);
printf("\nQuantity type: ");
scanf("%s", log.quantity_type);
log.added = time(NULL);

fwrite(&log,sizeof(log),1,f);

fclose(f);
}

void listAll(){
FILE *f;
struct log log;

f = fopen(fname,"rb");
if(f == NULL){perror("Can't open!\n");exit(1);}

printf("\n///////////////////////////////\n\n");
printf("\tList of all data\n\n");
printf("///////////////////////////////\n\n");

while(fread(&log,sizeof(log),1,f) == 1){
printf("%d\t",log.id);
printf("%s\t",log.name);
printf("%s\t",log.location);
printf("%d\t",log.quantity);
printf("%s\t",log.quantity_type);
printf("%s",ctime(&log.added));
}
printf("\n///////////////////////////////\n\n");

fclose(f);
}

int nextId(){
FILE *f;
struct log log;
int id = 1;

f = fopen(fname, "rb");
if(f == NULL){perror("Can't open!\n");}

while(!feof(f)){
fread(&log, sizeof(log), 1, f);
if(log.id >= id){id = log.id + 1;}
}

fclose(f);

return id;
}
  • 是否有更优雅的方式来完成这项任务?

最佳答案

这段代码的菜单显示/输入选择/切换部分有逻辑错误在用户有机会查看任何显示的数据之前,屏幕将被清除。

正确放置对 system(clear) 和 getchar() 的调用将解决问题一个函数应该只有 1 个正常退出。任何其他退出点应该仅针对错误情况

您可以尝试以下方法:

 system(clear);

int done = 0;
while( !done )
{
printf("///Log stuff!///\n\n");

printf("1. Add\n");
printf("2. List all\n");
printf("3. Exit\n");

printf("\n///////////////////////////////\n\n");

printf("Choose a number from the menu: ");
if( 1 != scanf("%d", &ch) )
{ // then scanf failed
perror( "scanf for menu choice failed" );
exit( EXIT_FAILURE );
}

// implied else, scanf successful

// eliminate menu from screen
system(clear);

switch(ch)
{
case 1:
add();
break;

case 2:
listAll();
printf( "\npress any key to continue\n" );
getchar();
break;

case 3:
done=1;
break;

default:
printf("\nyou entered an invalid menu selection, try again\n");
break;
} // end switch
} // end while

关于C - 功能没有执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29305711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com