Во-первых, у вас есть using namespace std;
где-то в вашем коде.Это иногда приводит к тонким ошибкам.Удали это.( Использование std Namespace )
int ware::load()
{
string inhalt;
cout << "please insert article number" << endl;
cin >> articlenumber;
Тип articlenumber
указан неверно.Объявите это std::string
, а не char[]
.( Что такое переполнение буфера и как его вызвать? )
productname.open(articlenumber, ios::in);
Нет никаких оснований для того, чтобы ifstream
лежал без дела в ожидании использования.Также нет смысла указывать ios::in
- это значение по умолчанию.Просто используйте форму с одним аргументом конструктора ifstream
.
if (!productname.is_open())
{
cout << "can't find the product." << endl;
return 1;
}
Не надо проверять, открылся ли файл.Вашим пользователям все равно, присутствует ли файл или нет, им важно, присутствовал ли файл, И вы получили необходимые данные.
if (productname.is_open())
{
while (!productname.eof())
{
getline(productname, inhalt);
strcpy(name,inhalt.c_str());
getline(productname, inhalt);
price = atoi (inhalt.c_str());
cout << inhalt << endl;
}
warenname.close();
}
Этот цикл просто неправильный.
- Никогда не вызывайте
eof()
.Он не делает то, что вы думаете, и вызывает ошибки. - Почему это цикл?Разве в файле нет только двух строк?
- Нет смысла вызывать
close
.Просто дайте файлу закрыться, когда istream
выходит из области видимости. - Почему
warename
отличается от productname
? - Не сохраняйте свои данные в
char[]
.Это 21 век.Используйте std::string
.
.
cout << endl << endl <<
"number: " << inhalt <<
" preis: " << price <<
" name: " << name <<
endl << endl; //this is a test and will be deleted in the final
- Никогда не используйте
endl
, когда вы хотите сказать '\n'
.Каждый из этих endl
манипуляторов вызывает flush
, что может быть очень дорого.( Что такое C ++ iostream endl fiasco? ) - Вы забыли
return
значение.
Попробуйте вместо этого:
int ware::load()
{
// This declaration should be local
std::string articlenumber;
cout << "please insert article number" << endl;
cin >> articlenumber;
// This declaration should be local
std::ifstream productname(articlenumber.c_str());
// These declarations can be class members:
std::string name;
int price;
std::string number;
if(getline(productname, name) &&
productname>>price &&
productname>>number)
{
cout << "\n\n" <<
"number: " number <<
" preis: " << price <<
" name: " << name <<
"\n\n"; //this is a test and will be deleted in the final
return 0;
} else {
cout << "can't find the product." << endl;
return 1;
}
}