title: invalid argument read write file
body: <p>typical beginner's phonebook program, attempting to add read and write to file capabilities. It's not compiling just fine but when I execute either functions 7 or 8, my errorhandler returns "invalid argument"</p>
  
  <p>EDIT* updated code for the whole thing, including several fixes:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  
  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 &lt;= 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", &amp;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 &lt; counter; x++)
         {
            if (strcmp(scrapcFirstName, phonebook[x].cFirstName) == 0) 
            {
               for (x = 0; x &lt; 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 &lt; 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 &lt; 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 &lt; 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);
  }
  </code></pre>
  
  <p>It's still giving me the same error, "invalid argument"</p>