2015-07-23 2 views
-2

Я написал программу телефонной книги. Тем не менее, я столкнулся с проблемой удаления функции. Например, когда я компилирую коды, которые ниже и следуют так:Проблема с функцией удаления

Я открываю файл и добавляю кого-то в список, введя 1 (используя первую функцию), после чего я ввожу 5, чтобы удалить этого человека из списка. Как и ожидалось, он правильно удаляет первую запись.

Отныне я добавляю другого человека, который должен быть указан, введя 4 (используя функцию добавления), и снова, чтобы удалить этого последнего человека, я вхожу в 5 и уведомляю об удалении «1» (используя функцию удаления).

После этого он показывает мне предупреждение на экране, как «Запись была очищена». Тем не менее, я вижу, что последняя запись все еще остается, когда я смотрю местоположение, которое является местом записи файла, и с помощью второй функции

Почему, в то время как в первый раз это удаление, со второго нет?

#include <stdlib.h>  // "stdlib" library contains of exit() function 
#include <malloc.h>  // "malloc" library contains of malloc() function 
#include <Windows.h> // "Windows" library contains of Sleep() function which waits the system as you want 
#include <io.h>  // "io" library contains of filelength() function 
#include <string.h> // "string" library contains of strlen() function 
#include <stdio.h> // "stdio" library contains of other functions which hasn't been mentioned 

struct personKnowledge // Structe and it's elements are being defined 
{ 
    char name[32]; 
    char surname[32]; 
    char number[32]; 
}; 

FILE *ptrFILE, *ptrFILE1; // Variables are being defined 
long int recordLength, totalRecordLength, location; 
int choice, number, totalRecordNumber, i; 
static int counter = 0; 

int menu(); // Functions are being defined 
void newRecord(); 
void display(); 
void update(); 
void add(); 
void deletE(); 

int main() // Program is being initialiezed 
{ 
    menu(); 
    return 0; 
} 

int menu() // Options are being presented to user 
{ 
    do 
    { 
     printf("\n\t\t --- Phone Book Program ---"); 
     printf("\n\n\t\t 1) Open file and record someone"); 
     printf("\n\n\t\t 2) Display person knowledge"); 
     printf("\n\n\t\t 3) Update person knowledge"); 
     printf("\n\n\t\t 4) Add person to list"); 
     printf("\n\n\t\t 5) Delete someone"); 
     printf("\n\n\t\t 6) Exit"); 
     printf("\n\n\nEnter your choice: "); 
     choice = 0; 
     scanf("%d", &choice); 
     fflush(stdin); 
     switch (choice) 
     { 
     case 1: 
     { 
      newRecord(); 
      break; 
     } 
     case 2: 
     { 
      display(); 
      break; 
     } 
     case 3: 
     { 
      update(); 
      break; 
     } 
     case 4: 
     { 
      add(); 
      break; 
     } 
     case 5: 
     { 
      deletE(); 
      break; 
     } 
     case 6: 
     { 
      printf("\nWorking has been completed.\n"); 
      return 0; 
     } 
     default: 
     { 
      printf("\nWrong entry! The program has been terminated.\n"); 
      break; 
     } 
     } 
    } while (choice >= 1 && choice <= 6); 
} 

void newRecord() // This function opens a file and records one person in file 
{ 
    if (counter > 0) 
    { 
     system("cls"); // Screen is being cleaned 
     Sleep(350);  // Sleep functions waits user for a while 
     printf("\nYou have already entered '1' and opened a file. To add a person please enter '4'\n"); 
     return; 
    } 
    else 
    { 
     if ((ptrFILE = fopen("Phone Book.dat", "wb")) == NULL) // wb is binary writing mode 
     { 
      printf("The file couldn't open\n"); 
      exit(EXIT_SUCCESS); 
     } 
     system("cls"); 
     Sleep(350); 
     struct personKnowledge *p; // p = (Person) 
     p = (struct personKnowledge *)malloc(sizeof(struct personKnowledge)); // Memory is being allocated 
     fflush(stdin); // Cache memory is being cleaned 
     recordLength = sizeof(*p); 
     printf("\n\Express person name: "); // User is entering the person's knowledge and they are being saved in file 
     fgets(p->name, sizeof(p->name), stdin); 
     size_t wordLength = strlen(p->name); // "size_t is unsigned integer type" 
     if (wordLength > 0 && p->name[wordLength - 1] == '\n') // This if idiom has been used for sentence seperation 
     { 
      p->name[--wordLength] = '\0'; 
     } 
     printf("Express %s's surname: ", p->name); 
     fgets(p->surname, sizeof(p->surname), stdin); 
     printf("Express %s's number: ", p->name); 
     fgets(p->number, sizeof(p->number), stdin); 
     fwrite(&(*p), recordLength, 1, ptrFILE); // Knowledge which has been got from user is being saved in file processionally 
     printf("\nPlease wait, information is saving to file..\n"); 
     Sleep(750); 
     printf("*-* Saving operation has been completed succesfully. *-*\n"); 
     free(p); // Allocated part of memory is being released 
    } 
    fclose(ptrFILE); // File is being closed 
    counter++; 
} 

void display() // If there is person knowledge which is searched in file, this function reads it and prints on the screen 
{ 
    if ((ptrFILE = fopen("Phone Book.dat", "rb")) == NULL) // rb is binary reading mode 
    { 
     printf("The file couldn't open\n"); 
     exit(EXIT_SUCCESS); 
    } 
    system("cls"); 
    Sleep(350); 
    struct personKnowledge *s; // s = (Searching) 
    s = (struct personKnowledge *)malloc(sizeof(struct personKnowledge)); 
    recordLength = sizeof(*s); // Necessary location calculations are being done and person's knowledge is being displayed 
    totalRecordLength = filelength(fileno(ptrFILE)); // The equalities explains what the purpose is from 137th line to 145th line 
    totalRecordNumber = totalRecordLength/recordLength; 
    printf("\n\nExpress person record number which you search: "); 
    number = -791673918435; 
    scanf("%d", &number); 
    fflush(stdin); 
    printf("\n*-* Person knowledge which you search *-*\n"); 
    Sleep(750); 
    location = (number - 1)*(recordLength); 
    fseek(ptrFILE, location, SEEK_SET); // The cursor locates place which is searched with fseek() function 
    if (fread(&(*s), recordLength, 1, ptrFILE) != 0 && number > 0) // If there is knowledge in that location and numbeer is greater than 0 
    { 
     printf("Name: %s\n", s->name); 
     printf("Surname: %s", s->surname); 
     printf("Number: %s\n", s->number); 
    } 
    else 
    { 
     printf("There is no record like this.\n"); 
     return; 
    } 
    free(s); 
    fclose(ptrFILE); 
} 

// In this function, the code line explanations are same as previous ones 
void update() // This function updates only one person knowledge from his/her name to phone number that gets from user again 
{ 
    if ((ptrFILE = fopen("Phone Book.dat", "rb+")) == NULL) // rb+ is both reading and writing mode 
    { 
     printf("The file couldn't open\n"); 
     exit(EXIT_SUCCESS); 
    } 
    system("cls"); 
    Sleep(350); 
    struct personKnowledge *d; // d = (Deleting) 
    d = (struct personKnowledge *)malloc(sizeof(struct personKnowledge)); 
    recordLength = sizeof(*d); 
    totalRecordLength = filelength(fileno(ptrFILE)); 
    totalRecordNumber = totalRecordLength/recordLength; 
    if (totalRecordNumber == 0) 
    { 
     printf("\nThere is no any record to update.\n"); 
     return; 
    } 
    printf("\nEnter the person record number which you update: "); 
    scanf("%d", &number); 
    fflush(stdin); 
    location = (number - 1)*(recordLength); 
    fseek(ptrFILE, location, SEEK_SET); 
    if (fread(&(*d), recordLength, 1, ptrFILE) == 0 || number <= 0) 
    { 
     Sleep(350); 
     printf("There is no record like this.\n"); 
     return; 
    } 
    else 
    { 
     fseek(ptrFILE, location, SEEK_SET); 
     printf("\n\Express new person name: "); 
     fgets(d->name, sizeof(d->name), stdin); 
     size_t wordLength = strlen(d->name); 
     if (wordLength > 0 && d->name[wordLength - 1] == '\n') 
     { 
      d->name[--wordLength] = '\0'; 
     } 
     printf("Express %s's surname: ", d->name); 
     fgets(d->surname, sizeof(d->surname), stdin); 
     printf("Express %s's number: ", d->name); 
     fgets(d->number, sizeof(d->number), stdin); 
     fwrite(&(*d), recordLength, 1, ptrFILE); 
     printf("\nPlease wait, information is saving to file..\n"); 
     Sleep(750); 
     printf("*-* Updating operation has been completed succesfully. *-*\n"); 
    } 
    free(d); 
    fclose(ptrFILE); 
} 

// In this function, the code line explanations are same as previous ones 
void add() // This functions records person in file as much as user wants 
{ 
    if ((ptrFILE = fopen("Phone Book.dat", "ab")) == NULL) 
    { 
     printf("The file couldn't open\n"); 
     exit(EXIT_SUCCESS); 
    } 
    system("cls"); 
    Sleep(350); 
    struct personKnowledge *a; // a = (Adding) 
    a = (struct personKnowledge *)malloc(sizeof(struct personKnowledge)); 
    fflush(stdin); 
    recordLength = sizeof(*a); 
    printf("\n\Express person name: "); 
    fgets(a->name, sizeof(a->name), stdin); 
    size_t wordLength = strlen(a->name); 
    if (wordLength > 0 && a->name[wordLength - 1] == '\n') 
    { 
     a->name[--wordLength] = '\0'; 
    } 
    printf("Express %s's surname: ", a->name); 
    fgets(a->surname, sizeof(a->surname), stdin); 
    printf("Express %s's number: ", a->name); 
    fgets(a->number, sizeof(a->number), stdin); 
    fwrite(&(*a), recordLength, 1, ptrFILE); 
    printf("\nPlease wait, information is adding to file..\n"); 
    Sleep(750); 
    printf("*-* Adding operation has been completed succesfully. *-*\n"); 
    free(a); 
    fclose(ptrFILE); 
} 

void deletE() // ?? 
{ 
    if ((ptrFILE = fopen("Phone Book.dat", "rb")) == NULL) 
    { 
     printf("The file couldn't open\n"); 
     exit(EXIT_SUCCESS); 
    } 
    if ((ptrFILE1 = fopen("Phone Book1.dat", "wb")) == NULL) 
    { 
     printf("The file couldn't open\n"); 
     exit(EXIT_SUCCESS); 
    } 
    system("cls"); 
    Sleep(350); 
    struct personKnowledge *del; // del = (Deleting) 
    del = (struct personKnowledge *)malloc(sizeof(struct personKnowledge)); 
    fflush(stdin); 
    recordLength = sizeof(*del); 
    totalRecordLength = filelength(fileno(ptrFILE)); 
    totalRecordNumber = totalRecordLength/recordLength; 
    printf("\nExpress person number which you want to delete: "); 
    scanf("%d", &number); 
    fflush(stdin); 
    if (fread(&(*del), recordLength, 1, ptrFILE) == 0 || number <= 0) 
    { 
     Sleep(350); 
     printf("There is no record like this.\n"); 
     return; 
    } 
    for (i = 1; i <= totalRecordNumber; i++) 
    { 
     if (i == number) 
     { 
      Sleep(350); 
      printf("The record has been cleared.\n"); 
      continue; 
     } 
     else 
     { 
      fwrite(&(*del), recordLength, 1, ptrFILE1); 
     } 
    } 
    fclose(ptrFILE); 
    fclose(ptrFILE1); 
    remove("Phone Book.dat"); 
    rename("Phone Book1.dat", "Phone Book.dat"); 
    free(del); 
} 
+4

Вы ожидаете, чтобы люди читали это более 300 строк кода для вас? Сузить. –

+0

Да, вы правы, но, поскольку я решил, что у меня есть только проблема с удалением функции, и я думаю о том, что некоторые люди могут захотеть запустить программу и хотят увидеть, как она работает. – NoWeDoR

+0

Я не понимаю вас. Ваша функция удаления не отменяет запись в вашем файле, а заменяет «Phone Book.dat» другой, только с первой записью, повторенной в течение всего времени «totalRecordNumber». – LPs

ответ

0

Функция удаления цикл должен быть следующим (обратите внимание, что &(*ptr) такая же, как только предоставление указатель):

if (number <= 0) 
{ 
    Sleep(350); 
    printf("There is no record like this.\n"); 
    return; 
} 
found= 0; 
while (fread(del, recordLength, 1, ptrFILE) != 0) 
{ 
    if (atoi(del->number)==number) 
    { 
     Sleep(350); 
     printf("The record has been cleared.\n"); 
     found= 1; 
     continue; 
    } 
    else 
    { 
     fwrite(del, recordLength, 1, ptrFILE1); 
    } 
} 
if (found==0) printf("There is no record like this.\n"); 
Смежные вопросы