C программа не может вставить в файл содержимое ранее прочитанного содержимого - PullRequest
0 голосов
/ 28 марта 2020

У меня есть эта проблема в моей c программе, когда я начинаю повторно вставлять содержимое моего файла и сохранять новый. Он терпит неудачу в то время как l oop, и я не понимаю, почему это происходит, если у меня есть какое-то содержимое для повторной вставки из него.

вот мой код: '' '

void init(){
    char pn[30],pd[30],pp[30];
    if ((flptr = fopen("MASTER.dat","r+")) == NULL) { 
        printf("Couldnt Get Cred");
        return;
    }
    fscanf(flptr,"%s %s %s",pn,pd,pp);


    while(!feof(flptr)){
        r = (struct Records *) malloc(sizeof(struct Records));
        int fr = fscanf(flptr,"%s %s %f",r->PartNum,r->PartDesc, &r->PartPrice);
        if(fr == EOF){
            printf("HERE");
            break;
        }

        if(head == NULL){
           head = r;
         }
         else{
             tail->next = r;
         }
         tail = r;
         }

         fclose(flptr);
    }


void put(){
    if ((flptr = fopen("MASTER.dat","r")) == NULL) { 
        printf("Couldnt Get Cred");
        return;
    }

    r = head;
    fprintf(flptr,"PartNumber PartDescription PartPrice\n");

    while (r != NULL){
        fprintf(flptr,"%s %s %f\n", r->PartNum, r->PartDesc, r->PartPrice);
        r = r->next;
    }

    fprintf(flptr,"Changes SAVED.");
    fclose(flptr);
}

1 Ответ

1 голос
/ 28 марта 2020

В функции положить вы открываете файл для чтения, а не для записи, поэтому ваш fprintf не будет иметь никакого эффекта и файл даже не будет создан

if ((flptr = fopen("MASTER.dat","r")) == NULL) { 

должно быть

if ((flptr = fopen("MASTER.dat","w")) == NULL) { 

Если позже вы попытаетесь прочитать этот несуществующий файл с init , вы не добьетесь успеха

Out из этого положить и init использовать глобальную переменную r и изменить ее, я рекомендую вам использовать локальную переменную, чтобы избежать возможных проблем


Почему вы открываете файл с помощью "r +" в init , когда вы только читаете его?


Когда вы читаете строку через (f) scanf Я рекомендую вам ограничить длину, чтобы не записывать из получателя неопределенное поведение, и всегда проверять результат, например, замените

fscanf(flptr,"%s %s %s",pn,pd,pp);

на

if (fscanf(flptr,"%29s %29s %29s",pn,pd,pp) != 3) {
  printf("invalid file contain\n");
  return;
}
...