Сравните строковую ошибку на языке C, используя File IO и 2Darray
Моя программа используется для удаления записи в файле данных. Я попрошу пользователя ввести "номер записи", который он хочет удалить. Однако, когда я использую strcmp эту функцию для сравнения двух строк, она не работает.
Проблема: невозможно с помощью strcmp удалить определенную запись и поместить обновленные данные в новый файл
Вот мой код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
Del_menu();
return 0;
}
// function1
int Del_menu() {
while (1) {
printf("Please enter a record number you wanted to delete : ");
Del();
printf("\nDo u want to delete other record? Enter 'y' for yes and
'n' for no :");
char ans;
scanf(" %c", &ans);
if (ans == 'N' || ans == 'n') {
break;
}
}
}
//function2
int Del(){
FILE *sfr = fopen("stock.txt", "r");
//just for me getting total number,you can igone this
char *str;
int total;
total=0;
while (!feof(sfr)){
str = fgetc(sfr);
if(str == '\n') {
total++;
}
}
total = (total/9);
fclose(sfr);
FILE *fileptr1, *fileptr2;
char filename[40] = "data.txt";
int total = 0;
int total_1 = 0 ,total_2 = 0, i = 0 , temp;
char itemrecord [40][40];
char quantity [40][40];
char weight [40][40];
char itemname [40][40];
char catagory [40][40];
char recipient [40][40];
char final_destination [40][40];
char status [40][40];
fseek(stdin, 0, SEEK_END);
fflush(stdin);
i++;
total--;
}
FILE *fileptr1, *fileptr2;
char filename[40]="stock.txt";
fileptr1 = fopen(filename, "r");
char buffer [50];
while(total_1!=0){
fgets(recordnum[i],50,fileptr1);
fgets(itemname[i],50,fileptr1);
fgets(itemrecord[i],50,fileptr1);
fgets(catagory[i],50,fileptr1);
fgets(quantity[i],50,fileptr1);
fgets(weight[i],50,fileptr1);
fgets(recipient[i],50,fileptr1);
fgets(final_destination[i],50,fileptr1);
fgets(status[i],50,fileptr1);
fgets(buffer, 50,fileptr1);
fclose(fileptr1);
fclose(fileptr2);
i++;
total_1--;
}
char del_data[41]; //get user input
fgets(del_data,50,stdin);
del_data[strlen(del_data) - 1] = '\0';
printf("\nyou have entered :%s\n", del_data);
printf("\nRecord in file before delete:\n");
printf("Total record: %d\n",total);
i=0;
while(total_2!=0){
printf("%s%s%s%s%s%s%s%s%s\n",recordnum[i],itemrecord[i],quantity[i],
weight[i],itemname[i], catagory[i],recipient[i],
final_destination[i],status[i]);
i++;
total_2--;
}
rewind(fileptr1);
fseek(stdin, 0, SEEK_END);
fileptr2 = fopen("copy.c", "w"); //stored the data after deleted
total_3=total_3 -1;
i=0;
while(total!=0){
if ( strcmp(recordnum[i],del_data) != 0){
printf("%s",recordnum[i]); //for me checking is it successful
fprintf(fileptr2,"%s%s%s%s%s%s%s%s%s\n",recordnum[i],itemrecord[i],
quantity[i],weight[i],itemname[i], catagory[i],recipient[i],
final_destination[i],status[i]);
i++; total--;}
}
remove(filename);
// rename the file copy.c to original name
rename("copy.c", filename);
} // end of function 2
Результат:
Please enter a record runber you want to delete: 1001
You enterd: 1001
Record in file before deleted:
Total:3
1001
Orange Laptop Computer DX5
235524
Electronics
1
1.8 kg
Chan
Mong Kok
Delivery
1002
Japanese Garden Pear Gift Box
300522
Food
2
4.2 kg
Cheung
Yuen Long
Arrival
1003
Koppo Badminton Racket GPX-15
77524
Fashion
3
0.6 kg
Lee Siu Yu
Fortress Hill
Warehouse
1001 // not exist after i finish this code
1002 // just for I debugging now
1003 // here is my problem* mean that cannot delete record successful
DO you want to delete other record?Enter'y' for yes, 'n' for no: n
1 ответ
Когда вы читаете выбор пользователя, вы осторожно удаляете завершающий символ новой строки, который fgets()
хранится в буфере, но вы не применяете ту же самую обработку к данным, которые вы читаете в свой массив. Кажется, что в вашем файле каждое поле находится на отдельной строке, поэтому в данных, которые вы считываете в свой массив, действительно есть новые строки. Поэтому сравнение не удается, потому что строки действительно разные.
Самым простым решением было бы прекратить удаление завершающей строки из пользовательского ввода. Есть много других проблем с этим кодом, но внесение этого изменения должно, по крайней мере, заставить его работать в соответствии с тем, о чем вы спрашивали.