0

典型的初学者电话簿程序,试图增加文件的读写能力。它编译得不好,但是当我执行函数 7 或 8 时,我的错误处理程序返回“无效参数”

EDIT* 更新了整个代码,包括几个修复:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct phonebook
   {
      char cFirstName[20];
      char cLastName[20]; 
      char PhoNo[20]; 
   } pb; 

//function prototypes
void AddContact (pb * ); 
void DeleteContact (pb * ); 
void ShowContacts (pb * ); 
void FindContact (pb * );
void RandContact (pb * );
void FindContact (pb * );
void DeleteAll (pb *);
void Read  (pb *);
void Write (pb *);

char FileName[100]; 
FILE *pRead; 
FILE *pWrite; 

int counter = 0;

main ()
   {      

   pb *phonebook; 
   phonebook = (pb*) malloc(sizeof(pb)*1);
   int iChoice = 0;

   while (iChoice <= 8)
   {
      printf("\n-Choose an option- \n");
      printf("\n\t(1)\tAdd Contact");
      printf("\n\t(2)\tDelete Contact");
      printf("\n\t(3)\tShow All Contacts");
      printf("\n\t(4)\tSearch for a Contact");
      printf("\n\t(5)\tRandom Contact");
      printf("\n\t(6)\tDelete All Contacts");
      printf("\n\n\t(7)\tWrite contacts to file");
      printf("\n\t(8)\tRead contacts from file");
      printf("\n\n\t(9)\tExit\n\n\t");

      scanf("%d", &iChoice); 

      if (iChoice == 1)
         {
            AddContact(phonebook); 
         } 

      if (iChoice == 2)
         {
            DeleteContact (phonebook); 
         } 

      if (iChoice == 3)
         {
            ShowContacts(phonebook); 
         } 
      if (iChoice == 4)
        {
            FindContact(phonebook); 
        }
      if (iChoice == 5)
        {
            RandContact(phonebook);
        }
      if (iChoice == 6)
        { 
            DeleteAll(phonebook);
        }
      if (iChoice == 7)
         {
            Write(phonebook);
         }
      if (iChoice == 8)
         {
            Read(phonebook);
         }  
      if (iChoice == 9)
         {
            free(phonebook);
            return 0;
         }           
      } //end while

   } //end main


 //function definitions

    //add contact
void AddContact (pb * phonebook)
{  
   counter++; //counter incremented for each entry
   realloc(phonebook, sizeof(pb)); //realloc with every new contact
      printf("\nFirst Name: ");
      scanf("%s", phonebook[counter-1].cFirstName);
      printf("Last Name: ");
      scanf("%s", phonebook[counter-1].cLastName);
      printf("Phone Number: ");
      scanf("%s", phonebook[counter-1].PhoNo);
      printf("\n\tContact added\n"); 
} 
    //delete contact
void DeleteContact (pb * phonebook)
{
   int x = 0;
   char scrapcFirstName[20];  //strings for deleting original strings
   char scrapcLastName[20];  
   char nullStr[20] = {"\0"}; 

      printf("\nFirst name: ");
      scanf("%s", scrapcFirstName);
      printf("Last name: ");
      scanf("%s", scrapcLastName);
     //compare strings
       for (x = 0; x < counter; x++)
       {
          if (strcmp(scrapcFirstName, phonebook[x].cFirstName) == 0) 
          {
             for (x = 0; x < counter; x++)
             {
                if (strcmp(scrapcLastName, phonebook[x].cLastName) == 0)
                {
                   strcpy(phonebook[x].cFirstName, nullStr); 
                   strcpy(phonebook[x].cLastName, nullStr); 
                   strcpy(phonebook[x].PhoNo, nullStr);
                }//end if
                   else
                   {
                      printf("Invalid Input");
                   }
             }//end for
          }//end if
   }   // end for
     counter--;   // Contact deleted, update counter
      printf("Contact Deleted\n");
   } 

    // show phonebook
void ShowContacts (pb * phonebook)
   {
      int x = 0;
      printf("\nPhonebook:\n\n ");
         for( x = 0; x < counter; x++) 
            {
               printf("\n(%d)\n", x+1);
              printf("Name: %s %s\n", phonebook[x].cFirstName, phonebook[x].cLastName);
               printf("Number: %s\n", phonebook[x].PhoNo); 
            } //end for
   }

   //Find a specific contact
void FindContact (pb * phonebook)
{
   int x = 0;
   char TempFirstName[20]; 
   char TempLastName[20]; 

   printf("\nWho are you looking for?");
   printf("\n\nFirst Name: ");
   scanf("%s", TempFirstName);
   printf("Last Name: ");
   scanf("%s", TempLastName);
   for (x = 0; x < counter; x++)
   {
      if (strcmp(TempFirstName, phonebook[x].cFirstName) == 0) 
      {
         if (strcmp(TempLastName, phonebook[x].cLastName) == 0) 
         {

            printf("\n%s %s \n%s\n", phonebook[x].cFirstName, phonebook[x].cLastName, phonebook[x].PhoNo);
         } 
      } 
   }     
}    

    //show a random contact
void RandContact (pb * phonebook)
{
   int iRand = 0;
   srand(time(NULL));
   iRand = rand() % counter;  
   int x = iRand; 

   printf("\n%s %s\n", phonebook[x].cFirstName, phonebook[x].cLastName);
   printf("%s\n", phonebook[x].PhoNo);
}    

    //delete all
void DeleteAll (pb * phonebook)
{
   int x = 0;
   char nullStr[20] = {'\0'}; 

   for ( x = 0; x < counter; x++ )
   {
      strcpy(phonebook[x].cFirstName, nullStr); 
      strcpy(phonebook[x].cLastName, nullStr); 
      strcpy(phonebook[x].PhoNo, nullStr); 
      --counter; 
   }   

   printf("Contacts have been wiped.\n");     
} 

void Read(pb * phonebook)
{
        FILE *pRead;
       char name[256];

        printf("File to read: ");
        gets(name);
        pRead=fopen(name,"a");

        if(pRead != NULL)
        {
            printf("Contact List");
            while(!feof(pRead)){
                fread(phonebook, sizeof (struct phonebook), 1, pRead);
                fclose(pRead);
                if (!feof(pRead)){
                fread(phonebook, sizeof (struct phonebook), 1, pRead);    
                fclose(pRead);          
                }
            }
        }
            else{

            goto ErrorHandler;

            }
    exit(EXIT_SUCCESS);
    ErrorHandler:
        perror("The following error occured");
        exit(EXIT_FAILURE);
}

void Write(pb * phonebook)
{
        FILE *pWrite;
        char name[256];

        printf("File to write:");
        gets(name);
        pWrite=fopen(name,"a");

        if(pWrite != NULL)
        {
                fwrite(phonebook, sizeof (struct phonebook), 1, pRead);
                fclose(pWrite);
        }
        else{

        goto ErrorHandler;

        }
    exit(EXIT_SUCCESS);
    ErrorHandler:
        perror("The following error occured");
        exit(EXIT_FAILURE);
}

它仍然给我同样的错误,“无效的论点”

4

2 回答 2

0

未设置文件名:这char name[256];就是fopen(name,"a")fopen 失败的原因。显然,在您的 scanf 之后,gets() 不起作用,请在第 49 行更正您的 scanf: 以scanf("%d\n" 在 C.Scanf 中输入,然后再获取。问题

已经指出了其他问题(*pRead 而不是 *pWrite),不关闭文件等。

于 2014-03-06T15:20:10.897 回答
0

在读取功能中,您使用了 pWrite 而不是 pRead

 pWrite=fopen(name,"a");

并检查 pRead 的 EOF 条件

 while(!feof(pRead))
于 2014-03-06T15:22:14.303 回答