读取文件中的数据问题

时间:2015-07-06 16:11:07

标签: 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 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);
    }   
}

3 个答案:

答案 0 :(得分:1)

fopen的{​​{3}}说mode&#34; w&#34;打开一个空文件进行读写。如果文件存在,则其内容将被销毁。

由于main中打开的第一个文件是

if ((ptrFILE = fopen("Phone Book.txt", "w+")) == NULL)
你摧毁了你已经拥有的任何东西。

要阅读内容,请使用模式"r"打开文件,阅读内容,然后将其关闭。

要添加新内容,请使用模式"w"重新打开并撰写整个内容,或以附加模式"a"打开,然后只需编写新记录。

或者您可以在模式"r+"中打开进行阅读和写作,但在写作之前,您需要fseek文件的结尾。

答案 1 :(得分:1)

int main()中,您使用&#34; w +&#34;打开文件模式,因此在调用它时,所有内容都将被丢弃。

同样在函数void display(FILE *ptrFILE)中,您还没有关闭文本文件。您在while循环中使用了feof(),这可能会产生问题。

请参阅以下链接,了解不应使用while(!feof()) - Why is “while ( !feof (file) )” always wrong?

的原因

答案 2 :(得分: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);//!!