Методът на търсене е неуспешен

Опитвам се да направя метод за търсене, в който проверява 2 идентификатора, които съхраняват само цяло число.

Първо имам база данни с клиенти. Въвеждам името, фамилията, ID и адреса един след друг в този ред и след това те веднага се записват във файла

Когато потребителят въведе личната карта, това извиква този метод за търсене и проверява целия файл, за да види дали идентификаторът е уникален или не. Ако не е, тогава връща 0, в противен случай връща 1

Сега проблемът е следният. Когато въвеждам идентификатора, независимо дали е уникален или не, той продължава, но след това, когато изведе това, което съм написал, за ИМЕТО и ФАМИЛИЯ показва само първия запис, който съм съхранил там (като заседнал в някакъв вид буфер), идентификаторът и адресът се извеждат нормално.

Файлът също НЕ е актуализиран, което означава, че файлът за запис не е възникнал. Сега, когато премахна този метод, добавянето работи нормално, но няма да имам достъп до сравняването на идентификатори.

Някакви предложения защо се случва това? и ако е възможно някаква идея как мога да го оправя? все едно когато използвам този метод за търсене, целият файл започва отначало и остава там. Опитах се да използвам метода с boolean, но все още без резултат. Когато се опитах да го използвам с Boolean вместо реда "if (customerID(scanf ("%d",&cCheck)) == 1)" го направих == TRUE, дава ми грешка, че изходът винаги ще бъде == FALSE, защото данните не са NULL.

и о, TRUE и FALSE са валидни в моя случай, тъй като имам typedef enum boolean в common.h

Кодът е както следва [публикуване на целия файл]: Въпросните методи са [ void addCustomer()] и [int customerID (int cCheck), но публикувах всички, тъй като някои от тях са взаимосвързани.

РЕДАКТИРАНЕ!!! - Идентификаторът, дори и да НЕ е уникален, пак се приема...

/*
 * CustomerMainMenu.c
 * Author: DodoSerebro
 *
 * This class will output the Customer's Main Menu and re-directs to the
 * corresponding section
 *
 */
#include<io.h>
#include<fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "..\Headers\common.h"
#include "..\Headers\customerManagement.h"

static FILE *cfp;
static customer c;
#define STRUCTSIZE sizeof (customer)


/** This is the Customers's Main Menu in which the various sections can be
 *  accessed from here
 */
boolean  customerMainMenu()
{



    int optionC;
    clrscr();

    copyright();


    printf ("\n\n\n\n\t\t    ************* Customer's Main Menu *************\n \n \n");

    printf ("Press [1] to add a new Customer\n");
    printf ("Press [2] to edit a Customer\n");
    printf ("Press [3] to list all Customers\n");
    printf ("Press [4] to Show a Customer's last Order\n");
    printf ("Press [5] to go back to Main Menu\n\n\n");


    if (scanf ("%d",&optionC) == 1)
    {
        switch (optionC)
        {

        case 1:
        {
            clrscr();
            getchar();
            addCustomer();
            break;
        }
        case 2:
        {
            printf ("Edit a Customer\n");
            break;
        }

        case 3:
        {
            clrscr();
            listCustomers();
            system ("PAUSE");
            break;
        }
        case 4:
        {
            printf ("Customer's Last Order\n");
            break;
        }
        case 5:
        {
            system ("PAUSE");
            break;
        }
        default:
        {
            if (optionC != 1 || optionC != 2 || optionC != 3 || optionC != 4 || optionC !=5)
            {
                clrscr();
                printf ("Invalid option!\n");
                system ("PAUSE");
                customerMainMenu();
            }
            break;
        }
        }
    }
    return TRUE;

}

/**
 *  This following method will append a customer to the
 *  database at the end of the file
 *
 *  */

void addCustomer ()
{
    char ch;
    copyright();

    printf ("\n\n\n\n\t\t    ************* Add Client **********\n \n \n");

    if ((cfp = fopen ("customers.dat","a+b")) == NULL)
    {
        fputs("Can't open customers.dat file\n",stderr);
    }



    printf ("\tThis will add another customer to the the database\n");
    printf ("\tPress 'Y' to confirm or 'N' to return to the Client Main Menu\n\tWITHOUT adding a customer\n");
    ch = getchar();

    if (ch == 'n' || ch == 'N')
    {
        customerMainMenu();
    }
    else if (ch == 'y' || ch == 'Y')
    {
        fflush(stdin);
        clrscr();
        printf ("\n\n\n\n\t\t    ************* Add Client **********\n \n \n");
        printf ("Please enter Name:\n");
        while (scanf ("%s", c.name) == 0 || cCheck(c.name,100) == FALSE);
        {

        }


        printf ("Please Enter Surname: \n");
        while (scanf ("%s",c.surname) == 0 && cCheck (c.surname,100) == FALSE);
        {

        }
        printf ("Please Enter ID Card, [NOTE! Only numbers are allowed!]\n");
        int cCheck;
        if (customerID(scanf ("%d",&cCheck)) == 1)
        {
            printf ("ID already Taken, Client exists!\n");
            printf ("Do you want to enter another ID? 'Y' for Yes and 'N' to return to Main Menu\n");
            ch = getchar();
            if (ch == 'Y' || ch == 'y')
            {
                scanf ("%d",&cCheck);
                customerID(cCheck);
                c.ID = cCheck;
            }
            else
            {
                customerMainMenu();
            }
        }
        else
        {
            c.ID = cCheck;
        }


        getchar();

        printf ("Please Enter Address:\n");
        gets(c.address);


        fwrite (&c,STRUCTSIZE, 1, cfp);

        printf ("For Testing purposes:\n");
        printf (" %s\n %s\n %s\n %d\n", c.name, c.surname, c.address, c.ID);
        askAnother();


    }
    else
    {
        printf ("\nInvalid choice! Either Y or N is accepted\n");
        system ("PAUSE");
        getchar();
        clrscr();
        addCustomer();
    }
}

void listCustomers()
{

    if ((cfp = fopen ("customers.dat","rb")) == NULL)
    {
        fputs("Can't open customers.dat file\n",stderr);
        printf ("Returning to Customer Main Menu");
        system ("PAUSE");
        customerMainMenu();
    }

    rewind (cfp);
    while (fread (&c,STRUCTSIZE,1,cfp)==1)
    {
        printf ("Customer: %s %s ID: %d\n", c.surname, c.name, c.ID);
    }
    fclose (cfp);


}


void askAnother()
{
    printf ("Do you want to add another Customer?\n");
    printf ("Enter 'Y' for yes and 'N' to return to the Main Menu\n");

    char input;
    input = getchar();

    if (input == 'Y' || input == 'y')
    {
        getchar();
        addCustomer();
    }
    else if (input == 'N'|| input == 'n')
    {

        fclose (cfp);
        customerMainMenu();

    }
    else
    {

        printf ("Invalid Option! Only Y or N are allowed\n");
        system ("PAUSE");
        clrscr();
        askAnother();

    }

}


boolean cCheck(char *test, int max)
{
    int x;
    for (x =0; x<max; x++)
    {
        if (isdigit(test[x]))
        {
            return FALSE;
        }
        if (x==max)
        {
            return TRUE;
        }
        x++;

    }
    return TRUE;
}

/**
 *  This method will compare the ID passed from the ID of the customer to check
 *  whether it is exists or not. If it exists it will output 1 otherwise it
 *  will output -1. This will make sure that the Person's ID is unique
 *
 */


int customerID (int cCheck)
{

    rewind (cfp);
    while (fread (&c,STRUCTSIZE,1,cfp)==1)
    {
        if (c.ID == cCheck)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }

    return 1;
}

РЕДАКТИРАНЕ!!

Качвам изображение, за да покажа какво имам предвид, ако не съм ясен

(Забележете как името и фамилията се различават от въведените) !http://s017.radikal.ru/i443/1212/c8/1ea9bc56d980.jpg

Следното показва какво имам във файла (само един файл) !http://s017.radikal.ru/i431/1212/49/2a0df6acf9ec.jpg


person DodoSombrero    schedule 20.12.2012    source източник
comment
Сега ми дайте номер на ред, където не успява, не очаквайте да прочета тази бъркотия.   -  person    schedule 21.12.2012
comment
145 е мястото, където ЗАПОЧВА да се проваля... След това SearchMethod започва на ред 273   -  person DodoSombrero    schedule 21.12.2012


Отговори (1)


if (customerID(scanf ("%d",&cCheck)) == 1)

Тук вие сте върнатата стойност на scanf() към функция customerID(), докато всъщност искате да предадете сканираната стойност cCheck.

Можете да разделите извикването на функция и четенето на вход, както е показано по-долу:

   if(scanf ("%d",&cCheck) != 1) {
   // Input error handling
   }
   else if (customerID(cCheck) == 1) {
    ...

Друг проблем е, че имате функция с име cCheck и също така имате локална променлива с име cCheck. Преименувайте по подходящ начин един от тях.

person P.P    schedule 20.12.2012
comment
Благодаря много, методите вече работят, но има малък проблем. След като добавя записа, той НЕ се добавя към файла, което означава, че файлът за запазване се игнорира - person DodoSombrero; 21.12.2012