Итак, вот некоторый код (такого рода проблемы не так просты, как кажется на первый взгляд):
#include <iostream>
#include <fstream>
#include <list>
#include <string>
#include <iterator>
#include <algorithm>
int main()
{
std::list<std::string> data;
// load data from file line-by-line
{ // you can make this a function if you want
std::ifstream file("test.txt");
std::string buffer;
while(std::getline(file, buffer))
data.push_back(buffer);
} // end of scope - file gets closed for us
// find end of guest-list - this is where new guests are added
std::list<std::string>::iterator guest_list_end =
std::find(data.begin(), data.end(), "Table list:");
data.remove("mary"); // remove mary from guest-list
data.insert(guest_list_end, "betty"); // append betty to guest-list
data.insert(guest_list_end, "harry"); // append harry to guest-list
// write entire file back
std::ofstream file("test.txt");
std::copy(data.begin(), data.end(),
std::ostream_iterator<std::string>(file, "\n"));
}
Поскольку в этом примере используется std::list
, итератор guest_list_end
остается в силе, даже когда мы добавляем или удаляем гостей.Имейте в виду, что find
и remove
в списках имеют линейную сложность, поэтому, если файл длинный, это может быть дорого.
В этом коде также предполагается, что за гостем следует список таблиц.Если это изменится, вы должны изменить find
-статмент.