2015-07-01 9 views
0

Я пытаюсь создать телефонную книгу, которая имеет пять функций в c. Я создал только первую функцию, которая берет и сохраняет в знаниях людей файла. Тем не менее, я не могу выполнить вторую функцию, которая ищет только знания человека (не всех) из файла.Как читать данные из файла?

Для запуска этой функции ("" функция 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 
#include <string.h> // "string" library contains of strcmp() function 

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

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

FILE *ptrFILE; 

int main() 
{ 
    int choice; 
    printf("\n\t\t *-* Phone Book Program *-*"); 
    do 
    { 
     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(); 
      break; 
     } 
     case 2: 
     { 
      display(); 
      break; 
     } 
     case 3: 
     { 
      break; 
     } 
     case 4: 
     { 
      break; 
     } 
     case 5: 
     { 
      break; 
     } 
     case 6: 
     { 
      printf("\nWorking has been completed.\n"); 
      exit(0); 
      break; 
     } 
     default: 
     { 
      printf("\nWrong entry! The program has been terminated.\n"); 
     } 
     } 
    } while (choice >=1 && choice <=6); 
    return 0; 
} 

void newRecord() 
{ 
    system("cls"); // Screen is being cleaned 
    if ((ptrFILE = fopen("Phone Book.txt", "w")) == NULL) 
    { 
     printf("The file couldn't open\n"); 
    } 
    else 
    {   
     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); 
     fprintf(ptrFILE, "Name\t\t\t\tSurname\t\t\t\t\tNumber\n"); 
     fprintf(ptrFILE, "--------\t\t ----------------\t\t\t---------------------\n"); 
     fprintf(ptrFILE, "\n%s%33s%38s\n", p->name, p->surname, p->number); 
     fclose(ptrFILE); 
     free(p); 
     printf("Please wait, information is saving to file..\n"); 
     Sleep(1000); 
     printf("*-* Saving operation has been completed. *-*"); 
    } 
    fclose(ptrFILE); 
} 

void display() 
{ 
    struct personKnowledge *s; // s means searching 
    char name[16]; 
    if ((ptrFILE = fopen("Phone Book.txt", "r")) == NULL) 
    { 
     printf("The file couldn't open\n"); 
    } 
    else 
    { 
     fseek(ptrFILE, 0L, SEEK_SET); 
     printf("Express name which you search: "); 
     gets(s->name); 
     while (!feof == NULL) 
     { 
      fscanf(ptrFILE,"%s", &name); 
      if (strcmp(s->name, name) == 0) 
      { 
       printf("qawsdsdf"); 
      } 
     } 
    } 
    fclose(ptrFILE); 
} 
+1

Вы, вероятно, нужно 'FOPEN («Телефон Book.txt»,«а»)', если вы хотите добавить запись в существующий файл. Обратите внимание на '' a '' вместо '' w '', который уничтожит существующий файл. –

+1

Я вижу, что вы используете страшный 'feof()', пожалуйста, прочитайте страницу руководства, так как ваше использование не удастся, также http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always- неправильно. Лучше использовать 'while (fgets (...)! = NULL)' и вырезать трейлинг-строки. –

+2

'if (s-> name == name)' неверно, он сравнивает указатели. Вам нужно 'if (strcmp (s> name, name) == 0)' для сравнения содержимого строки. Я подозреваю, что я найду еще много ошибок, если буду смотреть дальше. –

ответ

2

В ответ на один из ваших вопросов, я рекомендую переписывать эту петлю в display()

while (!feof == NULL)     // wrong way to use feof 
{ 
    fscanf(ptrFILE,"%s", &name);  // might overflow the string space 
    if (s->name == name)    // wrong way to compare strings 
    { 
     printf("qawsdsdf");    // missing newline? 
    } 
} 

с этим

while (fgets(name, sizeof(name), ptrFILE) != NULL) // safer way to read to a small buffer 
{ 
    name [ strcspn(name, "\r\n") ] = 0; // remove trailing newline etc 
    if (strcmp(s->name, name) == 0)  // compare the strings 
    { 
     printf("qawsdsdf\n");   // added newline 
    } 
} 

EDIT в любом случае, если ваш размещен код не даже скомпилировать надлежащим образом:

while (!feof == NULL) 

мусор, он должен был

while (!feof(ptrFILE)) 

хотя, как я сказал, это not the way to use feof в любом случае. Этого не произошло бы, если бы у вас были предупреждения о компиляторе и разрешены им.

0

Мое решение было изменить, как файл отформатирован

fprintf(ptrFILE, "\n%s%33s%38s", p->name, p->surname, p->number); 

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

void display() 
{ 
    struct personKnowledge s; // s means searching 
    char name[16]; 
    char sname[16]; 
    char number[16]; 
    char surname[16]; 
    if ((ptrFILE = fopen("Phone Book.txt", "r")) == NULL) 
    { 
     printf("The file couldn't open\n"); 
    } 
    else 
    { 
     printf("Express name which you search: "); 
     scanf("%s", &sname); 
     do 
     { 
      fscanf(ptrFILE,"%s%33s%38s", &name, &surname, &number); 
      if (strcmp(sname, name) == 0) 
      { 
       printf("%s %s %s", name, surname, number); 
      } 
     } 
     while (strcmp(sname, name) != 0); 
    } 
} 

P.S. Я все еще новичок в себе, и я не думаю, что могу дать вам хорошее объяснение, почему мой код работает, а ваш нет. Но я могу сказать, что те заголовки, которые вы писали в файле каждый раз, были основной частью проблемы, когда я искал ваш код.

0

Я думаю, что эти незначительные изменения будут решить вашу проблему

  • Выделяют память для хранения personKnowledge s = (struct personKnowledge *)malloc(sizeof(struct personKnowledge));
  • указатель файла Make достигает начальное местоположение данных. Для достижения этой цели был использован простой трюк fscanf(ptrFILE, "Name\t\t\t\tSurname\t\t\t\t\tNumber\n"); fscanf(ptrFILE, "--------\t\t ----------------\t\t\t---------------------\n");
  • Внесите изменения во время цикла. while (!feof(ptrFILE))
  • Сканирование одной строки данных. fscanf(ptrFILE, "\n%s%33s%38s\n", s->name, s->surname, s->number)
  • Внесите изменения в сравнение строк. if (strcmp(name,s->name) == 0)

Модифицированная функция дисплея

void display(){ 
     struct personKnowledge *s; 
     s = (struct personKnowledge *)malloc(sizeof(struct personKnowledge)); // Memory is being allocated for s 
     fflush(stdin); 

     char name[16]; 
     if ((ptrFILE = fopen("Phone Book.txt", "r")) == NULL) 
     { 
     printf("The file couldn't open\n"); 
     } 
     else 
     { 
     fseek(ptrFILE, 0L, SEEK_SET); 
     printf("Express name which you search: "); 
     scanf("%s",name);  //the name you want to retrieve 

     fscanf(ptrFILE, "Name\t\t\t\tSurname\t\t\t\t\tNumber\n"); 
     fscanf(ptrFILE, "--------\t\t ----------------\t\t\t---------------------\n"); //when we read the file for first time we need to start from the first location of person data, this is a trick to make ptrFILE reach there 
     fflush(stdin); 

     while (!feof(ptrFILE)) 
     { 
     fscanf(ptrFILE, "\n%s%33s%38s\n", s->name, s->surname, s->number);//same format as fprintf used in newRecord 
     if (strcmp(name,s->name) == 0) //comparison 
     { 
      printf("qawsdsdf"); 
     } 
     }}fclose(ptrFILE);} 
+0

Сначала этот метод произошел со мной, но я хотел написать по-другому. Я вижу, что это сложно, и верните это письмо. В любом случае, спасибо за все ваши комментарии. – NoWeDoR

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