При чтении объекта из файла возникает ошибка сегментирования
Я пытаюсь прочитать и записать объект из файла, записывает вроде хорошо, но при выводе пишет ошибку. Не могу разобраться в чем дело(
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;
}