Мне не повезло, что его точный код на самом деле работал на меня.Очевидно, есть какая-то основная проблема, которую я не вижу / не понимаю, потому что она больше не работает.
Вот что происходит: я передаю данные из файла и при использовании
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';