недопустимый аргумент чтение файла записи

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

РЕДАКТИРОВАТЬ * обновленный код для всего этого, включая несколько исправлений:

#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);
}

Он все еще дает мне ту же ошибку, "недопустимый аргумент"


person I Can't Advise You Counselor    schedule 06.03.2014    source источник
comment
В Read() полная путаница в отношении того, какой указатель файла используется. Кроме того, я не вижу fclose(), а feof() используется в плохом ключе.   -  person unwind    schedule 06.03.2014
comment
что вы имеете в виду конкретно? как лучше я могу использовать feof? Он ожидает выполнения условия, пока не будет достигнут конец файла.   -  person I Can't Advise You Counselor    schedule 06.03.2014
comment
Это часто упоминается, я должен искать ссылку. Вы не можете использовать feof() для обнаружения конца файла до попытки чтения и неудачи, потому что вы достигли конца файла. Предполагается, что его нужно использовать, чтобы выяснить, почему что-то пошло не так, а не предотвратить сбой. Просто читайте, пока чтение не подведет.   -  person unwind    schedule 07.03.2014
comment
Можете ли вы подтвердить, что имя файла, которое предоставляет пользователь, действительно существует? Также fopen может выдать эту ошибку, если имя файла недопустимо или не поддерживается. Есть некоторые другие проблемы, например, вы использовали указатель pRead в функции записи, и это нормально компилировалось ??   -  person ravi    schedule 07.04.2014


Ответы (2)


В функции чтения вы использовали pWrite вместо pRead

 pWrite=fopen(name,"a");

И проверка условия EOF для pRead

 while(!feof(pRead))
person Shashwat Kumar    schedule 06.03.2014
comment
исправлено это, все еще дает мне ту же ошибку, недопустимый аргумент - person I Can't Advise You Counselor; 06.03.2014

Имя файла не устанавливается: char name[256];, а затем fopen(name,"a"), поэтому fopen не работает. По-видимому, gets() не работает после вашего scanf, исправьте свой scanf в строке 49: на scanf("%d\n" Ввод в C. Scanf перед получением. Проблема

На другие проблемы уже указывалось (*pRead вместо *pWrite), не закрытие файлов и т. д.

person Boklucius    schedule 06.03.2014