无效参数读写文件

时间:2014-03-06 15:16:30

标签: c file error-handling read-write invalid-argument

典型的初学者电话簿程序,试图添加对文件功能的读写。它没有编译得很好但是当我执行函数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);
}

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

2 个答案:

答案 0 :(得分:0)

未设置文件名:char name[256];然后fopen(name,"a")这就是fopen失败的原因。 显然你的scan()在你的scanf之后不起作用,在第49行纠正你的scanf:到scanf("%d\n" Input in C. Scanf before gets. Problem

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

答案 1 :(得分:0)

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

 pWrite=fopen(name,"a");

检查pRead的EOF条件

 while(!feof(pRead))