2015-07-06 2 views
-3

Я пишу программу телефонной книги. Я выполнил первую функцию.Чтение данных в файле

Однако во второй функции (("" функция display() "")) есть что-то неправильное, чего я не мог найти.

В функции display() я беру другое имя, которое ищет пользователь и сравнивает его с именами в файл, чтобы показать знание этого человека (всего один человек) на экране. Но это не сработает. Как я могу решить эту проблему?

#include <stdio.h> 
#include <stdlib.h>  // "stdlib" library contains of exit() and malloc function 
#include <Windows.h> // "Windows" library contains of Sleep() function which waits the system as you want 
#include <string.h> // "string" library contains of strcmp() function which compares string statements 

struct personKnowledge 
{ 
    char number[16]; 
    char name[16]; 
    char surname[16]; 
    char sName[16]; 

}; 

void newRecord(FILE *); 
void display(FILE *); 
void deletE(); 
void add(); 
void update(); 

FILE *ptrFILE; 

int main() 
{ 
    int choice; 
    if ((ptrFILE = fopen("Phone Book.txt", "w+")) == NULL) 
    { 
     printf("The file couldn't open\n"); 
    } 
    do 
    { 
     printf("\n\t\t --- Phone Book Program ---"); 
     printf("\n\n\t\t 1) New record"); // The options are being presented to user 
     printf("\n\n\t\t 2) Display person knowledge"); 
     printf("\n\n\t\t 3) Delete someone"); 
     printf("\n\n\t\t 4) Add new person"); 
     printf("\n\n\t\t 5) Update person knowledge"); 
     printf("\n\n\t\t 6) Exit"); 
     printf("\n\n\nEnter your choice: "); 
     scanf("%d", &choice); 
     switch (choice) 
     { 
     case 1: 
     { 
      newRecord(ptrFILE); 
      break; 
     } 
     case 2: 
     { 
      display(ptrFILE); 
      break; 
     } 
     case 3: 
     { 
      break; 
     } 
     case 4: 
     { 
      break; 
     } 
     case 5: 
     { 
      break; 
     } 
     case 6: 
     { 
      printf("\nWorking has been completed.\n"); 
      exit(EXIT_SUCCESS); 
      break; 
     } 
     default: 
     { 
      printf("\nWrong entry! The program has been terminated.\n"); 
     } 
     } 
    } while (choice >= 1 && choice <= 6); 
    fclose(ptrFILE); 
    return 0; 
} 

void newRecord(FILE *ptrFILE) 
{ 
    static int counter = 0; 
    system("cls"); // Screen is being cleaned 
    struct personKnowledge *p; // p means person 
    p = (struct personKnowledge *)malloc(sizeof(struct personKnowledge)); // Memory is being allocated 
    fflush(stdin); 
    printf("\n\nDetermine person name: "); // User is entering the person's knowledge and they are being saved in file 
    gets(p->name); 
    printf("Determine %s's surname: ", p->name); 
    gets(p->surname); 
    printf("Determine %s's number: ", p->name); 
    gets(p->number); 
    if (counter == 0) 
    { 
     fprintf(ptrFILE, "Name\t\t\t\tSurname\t\t\t\tNumber\n"); 
     fprintf(ptrFILE, "--------\t\t ----------------\t\t------------------------\n"); 
    } 
    fprintf(ptrFILE, "\n%-33s%-33s%-38s\n", p->name, p->surname, p->number); 
    printf("Please wait, information is saving to file..\n"); 
    Sleep(750); 
    printf("*-* Saving operation has been completed. *-*\n"); 
    counter++; 
    free(p); 
} 

void display(FILE *ptrFILE) 
{ 
    if ((ptrFILE = fopen("Phone Book.txt", "r")) == NULL) 
    { 
     printf("The file couldn't open\n"); 
    } 
    else 
    { 
     system("cls"); // Screen is being cleaned 
     struct personKnowledge *s; // s means searching 
     s = (struct personKnowledge *)malloc(sizeof(struct personKnowledge)); 
     fseek(ptrFILE, 0L, SEEK_SET); 
     fflush(stdin); 
     printf("\n\nExpress name which you search: "); 
     gets(s->sName); 
     while (!feof(ptrFILE)) 
     { 
      fscanf(ptrFILE, "\n%-33s%-33s%-38s\n", &s->name, &s->surname, &s->number); 
      if (strcmp(s->name, s->sName) == 0) 
      { 
      printf("*-* Person knowledge who is you search *-*\n"); 
      Sleep(750); 
      printf("\n\nName: %s\nSurname: %s\nNumber: %s\n", s->name, s->surname, s->number); 
      } 
     } 
     free(s); 
    } 
} 
+0

вам нужно '' close' до того fopen' в 'display'. – BLUEPIXY

+0

Я добавил, но, к сожалению, это тоже не сработало – NoWeDoR

ответ

1

MSVC documentation из fopen говорит о mode: «ж» открывает пустой файл для чтения и записи. Если файл существует, его содержимое уничтожается.

Поскольку первый файл открыт в main является

if ((ptrFILE = fopen("Phone Book.txt", "w+")) == NULL) 

вы уничтожить все, что вы уже имеете.

Чтобы прочитать содержание, используйте режим "r", чтобы открыть файл, прочитать его и закрыть.

Чтобы добавить новый контент, заново откройте режим "w" и напишите весь контент или откройте в режиме добавления "a" и просто напишите новые записи.

Или вы можете открыть в режиме "r+" для чтения и записи, но перед записью вам нужно сделать fseek конец файла.

1

В int main() вы открыли файл с режимом «w +», чтобы все было отброшено в файле при его вызове.

Также в функции void display(FILE *ptrFILE) вы не закрыли текстовый файл. И вы использовали feof() внутри цикла while, который может создать проблему.

Пожалуйста, смотрите ссылку, почему вы не должны использовать while(!feof()) - Why is “while (!feof (file))” always wrong?

0
void display(FILE *ptrFILE) 
{ 
    fclose(ptrFILE);//!! flush out 
    if ((ptrFILE = fopen("Phone Book.txt", "r")) == NULL) 
    { 
     printf("The file couldn't open\n"); 
    } 
    else 
    { 
     char buff[128];//!!for fgets 
     system("cls"); // Screen is being cleaned 
     struct personKnowledge *s; // s means searching 
     s = (struct personKnowledge *)malloc(sizeof(struct personKnowledge)); 
     //fseek(ptrFILE, 0L, SEEK_SET);//!!no need 
     fflush(stdin); 
     printf("\n\nExpress name which you search: "); 
     gets(s->sName); 
     while (fgets(buff, sizeof buff, ptrFILE))//!! 
     { 
      sscanf(buff, "%15s%15s%15s\n", s->name, s->surname, s->number);//!! 
+0

Я не понимаю, где вы использовали 'fclose (ptrFILE)' в начале функции. Что это будет делать в отношении fopen в 'main()'.? – ameyCU

+0

'fclose (ptrFILE)' для следующего 'fopen (..," r ") ...'. Как это может быть, если есть целостность файла. – BLUEPIXY

+0

Я перенес fclose (ptrFILE) в конец функции newRecord() :) – NoWeDoR

Смежные вопросы