void write_file(int inum, FILE *inf, int size, int offset) { resize_file(inum, offset); u8 bytes[size]; for (int i = 0; i < size; i++) { u8 byte = fgetc(inf); bytes[i] = byte; } append_data_to_file(inum, bytes, size); }
void append_file(int inum, FILE *inf, int size) { printf("appen file\n"); u8 bytes[size]; for (int i = 0; i < size; i++) { u8 byte = fgetc(inf); bytes[i] = byte; } append_data_to_file(inum, bytes, size); }
int address(void) { struct address_data data; ADDRESS_BOOK address_config; /* initialize config of address book */ strcpy(address_config.filename, "address.txt"); address_config.last_id = 1; load_file(&address_config); for(;;) { switch(menu()) { case INPUT: input_data(&address_config, &data); append_data_to_file(address_config, data); break; case SHOW: show_data(address_config); break; case EDIT: edit_data(&address_config); break; case DELETE: delete_data(address_config); break; case SEARCH: search(address_config); break; case EXIT: exit(0); break; case CONFIG: config(&address_config); break; case STATUS: show_status(address_config); break; default: break; } } return 0; }
int edit_data(ADDRESS_BOOK *config) { int type; int match_flag = 0; int phone_flag = 0; int count; int index; int i, j, k; char buf[1024]; char format_str[1024]; char input_flag = 0; FILE *fp; char *filename = config->filename; struct address_data search, data; struct address_data list[1024]; int list_index[1024]; enum { ID, NAME, ADDRESS, PHONE, }; do { puts( "Please choose entry\n" "select search type\n" "[ID, Name, Address, Phone]"); fgets(buf, sizeof(buf), stdin); buf[strlen(buf) - 1] = '\0'; if(!strcmp(buf, "id") | !strcmp(buf, "Id") | !strcmp(buf, "ID")) { type = ID; input_flag = 1; } else if(!strcmp(buf, "name") | !strcmp(buf, "Name") | !strcmp(buf, "NAME")) { type = NAME; input_flag = 1; } else if(!strcmp(buf, "address") | !strcmp(buf, "Address") | !strcmp(buf, "ADDRESS")) { type = ADDRESS; input_flag = 1; } else if(!strcmp(buf, "phone") | !strcmp(buf, "Phone") | !strcmp(buf, "PHONE")) { type = PHONE; input_flag = 1; } } while(input_flag == 0); switch(type) { case ID: do { puts("Please enter id for edit"); printf("> "); fgets(buf, sizeof(buf), stdin); search.no = atoi(buf); } while(search.no == 0); break; case NAME: puts("Please enter name for edit"); printf("> "); fgets(buf, sizeof(buf), stdin); buf[strlen(buf) - 1] = '\0'; strncpy(search.name, buf, sizeof(search.name)); break; case ADDRESS: puts("Please enter address for edit"); printf("> "); fgets(buf, sizeof(buf), stdin); buf[strlen(buf) - 1] = '\0'; strncpy(search.address, buf, sizeof(search.address)); break; case PHONE: puts("Please enter phone number for edit"); printf("> "); fgets(buf, sizeof(buf), stdin); for(i = 0; buf[i] != '\n'; i++) { search.phone[i] = buf[i] - '0'; } search.phone[i] = END_OF_PHONE_NUMBER; break; } fp = fopen(filename, "r"); if(!fp) { fprintf(stderr, "Error: file open [%s]\n", filename); return -1; } for(count = 0, index = 0;;) { match_flag = 0; if(fgets(buf, sizeof(buf), fp) == 0) break; data = decode_data(buf); if(data.no == 0) continue; list[count] = data; list_index[count] = 0; if(data.status == (0x01 << HIDE)) { count++; continue; } switch(type) { case ID: if(search.no == data.no) match_flag = 1; break; case NAME: if(!strcmp(search.name, data.name)) match_flag = 1; else { for(i = 0; data.name[i] != '\0'; i++) { buf[i] = tolower(data.name[i]); } buf[i] = '\0'; if(!strcmp(search.name, buf)) match_flag = 1; } break; case ADDRESS: if(!strcmp(search.address, data.address)) match_flag = 1; break; case PHONE: for(i = 0; search.phone[i] != END_OF_PHONE_NUMBER && data.phone[i] != END_OF_PHONE_NUMBER; i++) { phone_flag = 0; if(search.phone[i] != data.phone[i]) break; phone_flag = 1; } if(phone_flag) match_flag = 1; break; } if(match_flag != 0) { list_index[count] = 1; index++; } count++; } if(index == 0) { puts("Not found!"); } else if(index == 1) { for(i = 0; i < count; i++) { if(list_index[i] == 1) { list[i].status = (0x01 << HIDE); break; } } } else if(index > 1) { printf("Find some entries!\nChoose entry\n"); for(i = 0, j = 0; i < count; i++) { if(list_index[i] == 1) { sprintf(format_str, "| %%2d | %%%ds | %%%ds | ", config->width_name, config->width_address); printf(format_str, j + 1, list[i].name, list[i].address); for(k = 0; list[i].phone[k] != END_OF_PHONE_NUMBER; k++) { printf("%d", list[i].phone[k]); } printf(" |\n"); j++; } } fgets(buf, sizeof(buf), stdin); for(i = 0, j = 0; i < count; i++) { if(list_index[i] == 1) { if((j - 1) == atoi(buf)) { list[i].status = (0x01 << HIDE); break; } j++; } } } fclose(fp); fp = fopen(filename, "w"); if(!fp) { fprintf(stderr, "Error: file open [%s]\n", filename); return -1; } for(i = 0; i < count; i++) { fprintf(fp, "%d,%s,%s,", list[i].no, list[i].name, list[i].address); for(k = 0; list[i].phone[k] != END_OF_PHONE_NUMBER; k++) { fprintf(fp, "%d", list[i].phone[k]); } fprintf(fp, ",%d\n", list[i].status); } fclose(fp); input_data(config, &data); append_data_to_file(*config, data); return 0; }
void write_data_to_file(int inum, void *data, size_t size, int offset) { resize_file(inum, offset); append_data_to_file(inum, data, size); }