for ( anrede=1;!user1.eof();anrede++){
if (anrede==1){
strcpy(Anrede,inhalt_anrede.c_str());
}
else
getline(user1, inhalt_anrede);
}
Приведенный выше код содержит ваше первое чтение файла, давайте проанализируем, что он делает. anrede начинается с 1, давайте предположим, что файл полон данных, поэтому мы не близки к концу, поэтому мы входим в цикл.
Вы проверяете, имеет ли значение anrede == 1, и копирует значение inhalt_anrede (которое пусто) в Anrede. Так что теперь Anrede - пустая и правильно завершенная нулем строка. Тогда ты увеличиваешь anrede. Мы еще ничего не прочитали из файла, поэтому мы, конечно, еще не достигли eof, поэтому мы входим в цикл.
Опять же, мы проверяем anrede == 1. Это не так, поэтому мы выполняем часть else, которая получает строку из файла и сохраняет ее в inhalt_anrede. Прибавьте еще раз, давайте предположим, что мы еще не достигли eof, поэтому мы снова входим в цикл.
Повторяйте предыдущий абзац непрерывно, читая файл построчно и отбрасывая результат до тех пор, пока мы не достигнем eof, затем цикл заканчивается. Все остальные циклы for требуют, чтобы мы не достигли eof. Но мы достигли eof, поэтому эти петли пропущены.
Поскольку вы не определили конструктор по умолчанию, все эти члены остаются неинициализированными, поэтому вы видите случайные числа и символы.
Исправление
Первое, что я делаю, это заменяю эти массивы символов в вашем классе на std :: string, потому что это упрощает мою жизнь. Я также удаляю эти ifstream-потоки из класса, для них нет никаких причин, мы их создадим, когда они нам понадобятся. Что касается функции, я не знаю точно, как устроен ваш файл, это предположение, основанное на том, что вы предоставили, но что-то вроде этого:
void Kunde::laden(){
string temp;
system("cls");
cout << "wie ist ihr nachname?" << endl;
cin >> nname;
ifstream user1(nname);
if(!user1.is_open()){
cout << "Datei nicht gefunden" << endl;
return;
}
getline(user1,Anrede);
getline(user1,vname);
getline(user1,nname);
getline(user1,temp);
echte_kontonummer = atol(temp.c_str());
getline(user1,temp);
echte_pin = atoi(temp.c_str());
getline(user1, temp);
Guthaben = atoi(temp.c_str());
cout << "Daten erfolgreich geladen." << endl;
cout << vname << " " << nname << " " << echte_kontonummer << " " << echte_pin << " " << Guthaben << endl;
}
Функция также предполагает, что файл правильный, и поэтому не проверяет ошибки. Если вы хотите, вы можете проверить возвращаемое значение каждой getline, например ::
if (!getline(user1,Anrede)) {
// handle error somehow
}
Если вы хотите проверить правильность числовых преобразований, вам нужно использовать что-то вроде новых функций C ++ 11, stoi, stoll и т. Д. ошибка. Если они недоступны, есть также строковые потоки, которые вы можете проверить следующим образом:
istringstream iss(temp);
if (!(iss >> echte_kontonummer)) {
// handle error somehow
}
Или вы можете использовать boost lexical_cast , который использует строковые потоки внутри и генерирует исключения при ошибке.