Я создал пользовательский класс String и некоторую функцию обработки файлов. Я пытался использовать g ++ в Ubuntu для компиляции этого куска кода и GDB для отладки несколько раз прежде. Ошибка была выдана в строке
s2.diskIn(iflile);
Интерфейс:
class String {
long unsigned int len;
char *cStr;
public:
String(const String &);
explicit String(const char * const = NULL);
void diskIn(std::ifstream &);
void diskOut(std::ofstream &);
const char *getString();
String operator = (const String);
~String();
};
Конструктор копирования
String::String(const String &ss) {
if (ss.cStr == NULL) {
cStr = NULL; len = 0;
} else {
len = ss.len;
cStr = new char[len + 1];
strcpy(cStr, ss.cStr);
}
}
Конструктор по умолчанию / присваивания
String::String(const char * const p) {
if (p == NULL) {
cStr = NULL; len = 0;
} else {
len = strlen(p);
cStr = new char[len + 1];
strcpy(cStr, p);
}
}
Функция ошибки:
void String::diskIn(std::ifstream &fin) {
String temp;
fin.read((char *)&temp.len, sizeof(int));
temp.cStr = new char[len + 1];
int i;
for (i = 0; i < temp.len; i++)
fin.get(temp.cStr[i]);
temp.cStr[i] = '\0';
*this = temp;
}
Оператор назначения копирования
String String::operator = (const String ss) {
if (cStr != NULL) {
delete[] cStr;
cStr = NULL;
len = 0;
}
if (ss.cStr != 0) {
len = ss.len;
cStr = new char[len + 1];
strcpy(cStr, ss.cStr);
}
return *this;
}
Destructor
String::~String() {
delete[] cStr;
}
int main() {
String s2;
std::ifstream ifile("document.txt");
s2.diskIn(ifile); //Error was thrown here
std::cout << s2.getString() << "\n";
ifile.close();
return EXIT_SUCCESS;
}