Я новичок в C, борюсь с проблемой домашнего задания C. Требуется, чтобы я создал простую программу, которая записывает тип struture в файл, а затем считывает файл, восстанавливая данные, вставленные ранее. У меня работают эти две части.
Существует еще одна функциональная возможность, которая требует замены типа 'char' в строках, ранее введенных в файл, другим значением. Желаемый эффект заключается в том, что он имеет начальное значение «0», которое позволяет отображать этот элемент, а при замене другим значением он больше не отображается.
Если бы кто-нибудь так любезно взглянул на это, чтобы помочь мне разобраться, я был бы очень благодарен.
Кстати, я прочитал другие вопросы в SO, касающиеся подобных тем, и все они следовали логике "замены" выходного файла, насколько я могу судить. Они использовали буфер для хранения данных и их последовательного сравнения, а затем выводили новый файл с другим содержимым.
Я пытаюсь сделать что-то другое, и то, что я нашел, на самом деле мне совсем не помогло.
Если ответ есть на один из этих других вопросов, пожалуйста, будьте любезны, укажите мне его и объясните.
Вот код, который я создал до сих пор, я добавил несколько комментариев, чтобы кратко объяснить части кода, так как выходные данные на португальском языке. Моя сложность в случае 3 переключателя (): S
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{
char license_plate[6];
char owner_name[80];
char deleted;
}vehicle_t;
void read_register(vehicle_t *v){ // function to read a struture of the type vehicle_t
char temp[8];
printf("insert license plate: \n");
scanf("%s", temp);
memcpy(v->license_plate, temp, 6);
printf("Insert owner name: \n");
getchar();
fgets(v->owner_name, 80, stdin);
v->deleted=0; // initializtion of 'deleted'
}
void print_register(vehicle_t *v){ // function to print a vehicle_t type
printf("\nRegister details: \n");
printf("License plate: ");
fwrite(v->license_plate, sizeof(char), 6, stdout);
printf("\nOwner: ");
printf("%s", v->owner_name);
printf("\n");
}
void show_menu(){ //just a small interface to display several options in a menu
vehicle_t reg;
char temp_del[10];
FILE *fp;
int opt;
system("clear");
printf("make your option:\n 1. new register \n 2. see registers \n 3. delete registers \n 4. exit \n");
scanf("%d", &opt);
getchar();
switch(opt){
case 1: //option to insert in the file 'registos.txt' - OK
system("clear");
fp = fopen("registers.txt", "a+");
read_register(®);
fwrite(®, sizeof(vehicle_t), 1, fp);
fclose(fp);
show_menu();
break;
case 2: // function to read from 'registos.txt' - also OK
system("clear");
fp = fopen("registers.txt", "r");
if(fp==NULL){ //no file test
system("clear");
printf("No file!\n");
getchar();
show_menu();
}else{ // if 'deleted' is != 0 don't print it out
while(fread(®, sizeof(vehicle_t), 1, fp)!=0){
if(reg.deleted==0){
print_register(®);
}
}
printf("Press enter!");
fclose(fp);
getchar();
show_menu();
}
break;
case 3:
system("clear");
printf("License plate to delete?:\n");
scanf("%s", temp_del);
fp = fopen("registers.txt", "r+");
while(fread(®, sizeof(vehicle_t), 1, fp)!=0){
// my problem is here! i'm not getting the 'deleted' value replaced in the file from '0' to '1'. I'm trying to find it's position and then goback the size of the struture and replace with the value '1' at the end. what am i doing wrong?
if(strcmp(reg.license_plate, temp_del)==0){
reg.apagado='1';
fseek(fp, -sizeof(vehicle_t), SEEK_CUR);
fwrite(®, sizeof(vehicle_t), 1, fp);
printf("Register deleted!\n");
}
fclose(fp);
getchar();
show_menu();
}
break;
case 4:
system("clear");
return;
break;
default:
printf("No such option, please wait 3 seconds.\n");
system("sleep 3");
show_menu();
break;
}
}
int main(){
show_menu();
return 0;
}