简体   繁体   English

无效的参数读写文件

[英]invalid argument read write file

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" 它不是很好编译,但是当我执行函数7或8时,我的错误处理程序返回“无效参数”

EDIT* updated code for the whole thing, including several fixes: 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);
}

It's still giving me the same error, "invalid argument" 它仍然给我同样的错误,“无效参数”

The file name is not being set: char name[256]; 未设置文件名: char name[256]; and then fopen(name,"a") that's why fopen fails. 然后是fopen(name,"a") ,这就是fopen失败的原因。 Apparently gets() does not work after your scanf, correct your scanf on line 49: to scanf("%d\\n" Input in C. Scanf before gets. Problem 显然,在scanf之后gets()无法正常工作,请在第49行上更正您的scanf:至scanf("%d\\n" 在C.Scanf中的输入在获取之前。

The other problems have been already pointed out (*pRead instead of *pWrite), not closing files etc. 已经指出了其他问题(* pRead而不是* pWrite),而不是关闭文件等。

In read function you have used pWrite instead of pRead 在读取功能中,您使用了pWrite而不是pRead

 pWrite=fopen(name,"a");

And checking for EOF condition for pRead 并检查pRead的EOF条件

 while(!feof(pRead))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM