Stringstream выводит правильные данные, но не извлекает правильные данные - PullRequest
0 голосов
/ 22 октября 2018

Мне не повезло, что его точный код на самом деле работал на меня.Очевидно, есть какая-то основная проблема, которую я не вижу / не понимаю, потому что она больше не работает.

Вот что происходит: я передаю данные из файла и при использовании

buffer >> table_data;

Когда я вывожу table_data каждый раз, он начинается с середины буфера.Хитрость, если я вывожу буфер, используя

std::cout << buffer.str();

, что даст правильные данные.Таким образом, буфер потока имеет все нужные вещи, он просто не входит в table_data правильно.

См. Полный блок кода ниже.

    //read from table
    buffer << table.rdbuf();
    buffer.clear(); 

    //clear table contents for rewrite later
    table.clear();

    std::ofstream table(filename);

    while (buffer >> table_data)
    {
        temp_vec.push_back(table_data);

        //num_table_items = 3, which is correct.
        for (int i = 1; i < num_table_items; i++)
        {
            buffer >> table_data;
            temp_vec.push_back(table_data); 
        }


        //I removed the part where I write to the table from the vector because the problem is above.           

        temp_vec.clear();           

    }

, если это имеет значение, это то, что буферчитает из файла:

1       'Gizmo'             19.99       
2       'PowerGizmo'        29.99       
3       'SingleTouch'       149.99      
4       'MultiTouch'        199.99      
5       'SuperGizmo'        49.99   

И вот что печатается, когда я делаю std :: cout << buffer.str ();однако, если я печатаю данные таблицы после обеих строк «buffer >> table_data» в коде, я получаю это (те же результаты, если я печатаю вектор):

Gizmo'          29.99           3
'SingleTouch'   149.99          4
'MultiTouch'    199.99          5
'SuperGizmo'    49.99           49.99

Посмотрите, как это начинается в середине?«Гизмо» даже пропускает свой первый апостроф.Есть идеи, что происходит?Я пропускаю что-то очевидное?

** РЕДАКТИРОВАТЬ: Вот больше кода в соответствии с просьбой.Это оператор if, который в конечном итоге вызывает функцию, всю функцию и объявление функции из моего класса Table.Спасибо всем за помощь.

//Function definiton
void update_table(std::string table_name, std::string table_path, std::string set_schema, std::string set_item, 
            std::string where_schema, std::string where_item);

//From file that calls the function

if (text == "DELETE" || text == "Delete" || text == "delete")
        {
            //skips "from"
            std::cin >> objName >> objName >> text;

            if (objName.back() == ';')
                {
                    objName = objName.substr(0, objName.size()-1);
                }
            if (text == "WHERE" || text == "Where" || text == "where")
            {

                std::cin >> del_name >> operation >> del_param;
                if (del_param.back() == ';')
                {
                    del_param = del_param.substr(0, del_param.size()-1);
                }
                table.delete_table_data(objName, use_DB, del_name, operation, del_param);
            }
        }



//The entire function
void Table::update_table(std::string table_name, std::string table_path, std::string set_schema, std::string set_item,
    std::string where_schema, std::string where_item)
{
    chdir(table_path.c_str());

    filename = table_name + ".txt";
    std::ifstream table (filename);

    //init counter


    if (table)
    {
        getline(table, table_data);
        table_info.str(table_data);
        table_info.clear();
        buffer << table.rdbuf();
        buffer.clear();
        buffer.str();

        table.clear();
        //Unneccessary?
        table.close();

        std::ofstream table(filename);



        //Finds size of table, writes table labels back to file.
        num_table_items = 0;

        modify_count = 0;

        while(table_info >> item_name)
        {
            table_info >> item_type;

            table << item_name << " " << item_type << "\t\t";

            if (item_name == set_schema) // && item_name == where_schema
            {
                set_index = num_table_items;
            }

            if (item_name == where_schema)
            {
                where_index = num_table_items;
            }

            num_table_items++;  

        }

        std::cout << buffer.str() << std::endl;
        while (getline(buffer, table_data))
        {
            std::cout << table_data << std::endl;
            temp_vec.push_back(table_data);

            for (int i = 1; i < num_table_items; i++)
            {
                buffer >> table_data;
                std::cout << "i = " << i << " Data = " << table_data << std::endl;
                temp_vec.push_back(table_data);

            }

            if (temp_vec[where_index] == where_item)
            {
                modify_count++;
                temp_vec[set_index] = set_item;
            }                   

            //store in vector
            for (int i = 0; i < temp_vec.size(); i++)
            {
                table_vec.push_back(temp_vec[i]);
                std::cout << temp_vec[i] << " ";
            }

            temp_vec.clear();           

        }


        for (int i = 0; i < table_vec.size(); i++)
        {
            if (i % num_table_items == 0)
            {     
                table << "\n" << table_vec[i] << "\t";
            }

            else if (i % num_table_items == num_table_items - 1)
            {
                table << table_vec[i];
            }

            else
            {
                table << table_vec[i] << "\t\t";
            }

            if (table_vec[i].length() < 8 && i % num_table_items != num_table_items - 1)
            {
                table << "\t";
            }
        }

        table.close();
        table_vec.clear();
        table_info.clear();
        table_info.str();

        //write vector to file.
        if (modify_count == 1)
        {
            std::cout << "-- " << modify_count << " record modified." << std::endl;
        }

        else
        {
            std::cout << "-- " << modify_count << " records modified." << std::endl;
        }
    }

    else
    {
        std:: cout << "-- !Failed to query " << table_name << " because it does not exist" << std::endl;
    }
}

пользовательский ввод, который должен вызвать это: обновить имя набора продуктов = 'Gizmo', где name = 'SuperGizmo';

или

обновление Цена набора продуктов = 14.99, где name = 'Gizmo';

...