C ++ не конвертирует строку из данных - PullRequest
0 голосов
/ 24 сентября 2011

Я хочу написать небольшую программу, которую следует использовать в супермаркетах. все вымышлено, и это только для учебных целей. Тем не менее, инструмент генерирует новые данные для каждой новой статьи. в данных есть 2 строки, имя и приз. Данные называются номером артикула продукта. Таким образом, пользователь вводит артикульный номер, и инструмент ищет данные с этим номером, если он их нашел, он читает 2 строки и инициирует переменные. Но по некоторым причинам он не конвертирует и не копирует строки правильно. вот часть, которая загружает данные.

int ware::load()
{    
    string inhalt;

    cout << "please insert article number" << endl;
    cin  >> articlenumber;

    productname.open(articlenumber, ios::in);

    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();    
    }

    cout << endl << endl <<
        "number: " << inhalt <<
        "  preis: " << price <<
        "  name: " << name <<
        endl << endl; //this is a test and will be deleted in the final

}

надеюсь, вы можете мне помочь!

Вот класс:

    class ware{

private:
    char     articlenumber[9];
    char     name[20];
    int      price;
    fstream  warennamefstream;
    ifstream warenname;

public:
    void newarticle(); //this to make a new product.
    void scan();       //this to 'scan' a product (entering the article number ;D)
    void output();     //later to output a bill
    int  load();       //load the datas.


};

надеюсь, что все в порядке.

1 Ответ

1 голос
/ 24 сентября 2011

Во-первых, у вас есть 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...