The 1. and 3. menu items are working, but if I choose the 2. menu item it's not listing my data. Why is that? (It has to be compiled and run in linux command line [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;
}
- Is there a more elegant way to do this task?