Программирование на C - как я могу поместить текстовый файл в мой массив? - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь написать программу, которая может удалить запись в файле IO.Содержимое файла установлено по умолчанию.Сейчас я пытаюсь поместить содержимое моего текстового файла в массив, но происходит какая-то проблема ...

Во-первых, это мой файл данных по умолчанию:

1001
eric
1
human
10
70.00
eric
home
arrive


1002 
She
1 
human 
10 
50.00 
she
home 
arrive


1003 
She_eric
2 
human 
10 
120.00 
eric 
home 
arrive

Вот мойкод: (я использую fscanf, помещая данные моего текстового файла в массив, вы можете видеть его посередине об открытом файле для чтения)

#include <stdio.h>
#include <stdlib.h>
struct record{
char recordnum [40];
char itemrecord [40];
char quantity [40];
char weight [40];
char itemname [40];
char catagory [40];
char recipient [40];
char final_destination [40];
char status [40];
};



int main()
{
FILE *fileptr1, *fileptr2, fileptr3;
char filename[40]="record.txt";
char save;
int delete_num, temp ;
char reply;

#define MAX 9
struct record Arr[MAX];

printf("Enter file name: ");
scanf("%s", filename);


do{
temp =1; //reset temp and loop can work below time

//open file in read mode
fileptr1 = fopen(filename, "r");
if (fileptr1== NULL){
printf("open unsuccessful,file not exist"); 
exit(1);
}

save = getc(fileptr1);
while (save != EOF)
{
    printf("%c", save);
    save = getc(fileptr1);
    int i =0;
    for (i=0; i<3 ; i++){

    fscanf(fileptr1,"%s %s %s %s %s %s %s %s %s", Arr[i].recordnum, 
 Arr[i].itemname, Arr[i].itemrecord, Arr[i].catagory, Arr[i].quantity, 
 Arr[i].weight, Arr[i].recipient, Arr[i].final_destination, Arr[i].status 
 ); 

}
}
//rewind
rewind(fileptr1);


printf(" \n\n Enter record number to be deleted <type 0 = not delete 
anything>:");
fflush(stdin);
scanf("%d", &delete_num);


//open new file in write mode
fileptr2 = fopen("copy.c", "w");
save = getc(fileptr1);
while (save != EOF)
{
    save = getc(fileptr1);
    //except the line to be deleted
    int i ;

    for (i=0;i<3;i++){

    if (temp != delete_num)
    {
        //copy all lines in file replica.c
        putc(save, fileptr2);
}}
}




fclose(fileptr1);
fclose(fileptr2);
remove(filename);
//rename the file replica.c to original name
rename("copy.c", filename);
fflush(stdout);
printf("\nThe contents of file after being changed are as follows:\n");

fileptr1 = fopen(filename, "r");
save = getc(fileptr1);
while (save != EOF)
{
    printf("%c", save);
    save = getc(fileptr1);
}
fclose(fileptr1); 

fflush(stdin);

printf("\n\n Delete anther item?<y/n>: ");
scanf("%c",&reply);  



}while(reply=='y' || reply=='Y');
return 0;
}

Извините за мой длинный код ......

Результат:

Enter file name:record.txt
10 
Enter record number to be deleted <type 0 = not delete anything>:1001
The contents of file after being changed are as follows:

0000000111
eeerrriiiccc
111
hhhuuummmaaannn
111000
777000...000
eeerrriiiccc
hhhooommmeee
aaarrrrrriiivvveee

и ниже тот же результат ...... интересно ....

Это не мой ожидаемый результат ... я знаю, что слово появляетсятри раза из-за моего цикла.Тем не менее, я хочу, чтобы цикл выполнялся 3 раза, в первый раз включить запись 9 и ниже.

1 Ответ

0 голосов
/ 24 ноября 2018

Вы используете getc для чтения символов из файла, но затем отбрасываете их.Таким образом, вы можете потерять значимых персонажей.Вы также не проверяете возвращаемое значение fscanf, чтобы увидеть, удалось ли это, оставляя возможность получать ошибки, не осознавая этого.Вы можете исправить это, избавившись от вызовов getc и используя возвращаемое значение fscanf для управления циклом:

while (fscanf(fileptr1,"%39s%39s%39s%39s%39s%39s%39s%39s%39s",
              Arr[i].recordnum, Arr[i].itemname, Arr[i].itemrecord,
              Arr[i].catagory, Arr[i].quantity, Arr[i].weight,
              Arr[i].recipient, Arr[i].final_destination, Arr[i].status) == 9) {
    if (++i >= MAX)
        break;
}

Затем, чтобы записать файл, вы хотите удалить запрошенную запись, а не просто одна строка.Поэтому лучше всего (пере) записать файл с нуля, используя данные, которые вы ранее прочитали в Arr, и пропустить запись, которую вы хотите удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...