При чтении объекта из файла возникает ошибка сегментирования

Я пытаюсь прочитать и записать объект из файла, записывает вроде хорошо, но при выводе пишет ошибку. Не могу разобраться в чем дело(

using namespace std;

class String
{
private:
  char* Str;
  int Length;
public:
  String();
  String( char* ptr);
  String(const String& t);
  String& operator = (String& t);
  bool is_empty() const;
  char* getStr();
  int getLength() const;
  friend ostream & operator<<(ostream & in, const String & s)
  {
   in<< " "<<s.Str;
    return in;
  }
  String& Print();
  ~String();
};

int main(int argc, char** argv)
{
                 std::ofstream as;
                 as.open(argv[3], std::ios::binary);
                 if (!as.is_open())
                 {
                  printf("not such fail or directoru\n");
                  exit(-1);
                 }
                 else
                 {
                   printf("Printf record in fail\n");
                   int N =atoi(argv[2]);
                   as.write((char*)&N,4);
                   String Town[N][5];
                   for (int i=0;i<N;i++)
                   {  
               std::cout<<"Write name town\n";
                       Town[i][0].Print();
                       as.write((char*)&Town[i][0],sizeof(String)); 
                       std::cout<<"Write number inhabitant\n";
                       Town[i][1].Print();
                       as.write((char*)&Town[i][1],sizeof(String)); 
                       std::cout<<"Write squre town, in km^2\n";
                       Town[i][2].Print();
                       as.write((char*)&Town[i][2],sizeof(String));
                       std::cout<<"Write year bulding\n";
                       Town[i][3].Print();
                       as.write((char*)&Town[i][3],sizeof(String));
                       std::cout<<"Write number school in town\n";
                       Town[i][4].Print();
                       as.write((char*)&Town[i][4],sizeof(String));
                   }
                   as.close();
                 std::ifstream ifs;
                 ifs.open(argv[3], std::ios::binary);
                 if (!ifs.is_open())
                 {
                  printf("not such fail or directoru\n");
                  exit(-1);
                 }
                 else
                 {
                   int N =atoi(argv[2]);
                   if (ifs.eof()) 
                       {
                       printf("File empty\n");
                       exit(-1);
                       }
                    ifs.read((char*)&coun,4);
                    std::cout<<"kol-vo records "<<coun<<"\n";
                    std::cout<<"Name town(type string(5))   |     number inhabitant(type int(10)   |     squre town, in km^2(type int(10)   |    year bulding(type int(1)   |     number school(type int(2))   |     \n";
                   String Town[N][5];
                   for (int i=0;i<(coun);i++)
                   {              ifs.read((char*)&Town[i][0],sizeof(String));
                                  std::cout<<Town[i][0]<<":     ";
                                  ifs.read((char*)&Town[i][1],sizeof(String));
                                  std::cout<<Town[i][1]<<":     ";
                                  ifs.read((char*)&Town[i][2],sizeof(String));
                                  std::cout<<Town[i][2]<<":     ";
                                  ifs.read((char*)&Town[i][3],sizeof(String));
                                  std::cout<<Town[i][3]<<":     ";
                                  ifs.read((char*)&Town[i][4],sizeof(String));
                                  std::cout<<Town[i][4]<<":     ";
                                  std::cout<<std::endl;
                   }    
                    ifs.close();                
                    printf("\x1B[37m");
                   exit(-1);
return 0;
}

String::String()
 {
  Str = 0;
  Length = 0;
 }

String::String(char* ptr)
{
  Length=strlen(ptr);
  Str=new char[Length + 1];
  strcpy(Str, ptr);
}

String::String(const String& t)
{
  Length=strlen(t.Str);
  Str=new char[Length + 1];
  strcpy(Str, t.Str);
}
String& String::operator = (String& t)
{
  swap(Length, t.Length);
  swap(Str, t.Str);
  return *this;
}
bool String::is_empty() const
{
  return Str == 0 || Str[0] == '\0';
}

char* String::getStr()
{
  return Str;
}
  String& String::Print()
{  int i=0;
   char t[200];   
   cin.getline(t,200,'\n');
   Length=strlen(t)+1;
   Str=new char[Length];
   strcpy(Str, t);
   return *this;
}
  
int String::getLength() const
{
  return Length;
}

String::~String()
{
  Length = 0;
  delete[] Str;
  Str = 0;
}

Ответы (0 шт):