Неверный аргумент читать запись файла

Типичная программа телефонной книги новичка, пытающаяся добавить возможности чтения и записи в файл. Это не просто компилируется, но когда я выполняю функции 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);
}

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

2 ответа

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

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

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

 pWrite=fopen(name,"a");

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

 while(!feof(pRead))
Другие вопросы по тегам