Работа с вкладками с ifstream и чтение произвольного числа значений в вектор - PullRequest
0 голосов
/ 08 ноября 2018

Я в основном работаю с фрагментами текстового файла, подобного этому:

6
    Jane Doe
    1942
    90089
    3 1 5 12

В строках 2-5 есть вкладки. Я пытаюсь сохранить каждое из значений в соответствующей переменной, и я хотел бы, чтобы числа в нижней строке сохранялись в векторе, называемом друзьями, например, <3, 1, 5, 12>. В последней строке может быть произвольное количество чисел. Я также не знаю, упускаю ли я что-нибудь из-за того, как ifstream обрабатывает вкладки.

Вот что у меня есть:

int id;
ifile >> id;
string name;
getline(ifile, name);
int year;
ifile >> year;
int zip;
ifile >> zip;
vector<int> friends;
// Not sure how to read in the vector if it has an arbitary length
// Use getline and somehow read everything in from the string?

Как бы я приблизился к вектору? Пока цикл?

1 Ответ

0 голосов
/ 08 ноября 2018

Я думаю, что чтение каждого поля с помощью std::getline делает код понятным и читаемым. В последней строке, читая строку, используя std::getline и std::stringstream, мы можем прочитать произвольное число чисел следующим образом. Этот пост был бы полезен.

std::string buffer;

std::getline(ifile, buffer);
const int id = std::stoi(buffer);

std::string name;
std::getline(ifile, name);
name.erase(std::remove(name.begin(), name.end(), '\t'), name.end());

std::getline(ifile, buffer);
const int year = std::stoi(buffer);

std::getline(ifile, buffer);
const int zip = std::stoi(buffer);

std::getline(ifile, buffer);
std::stringstream ss(buffer);
std::istream_iterator<int> begin(ss), end; //defaulted end-of-stream iterator.
const std::vector<int> v(begin, end);

std::cout
    << "id:" << id << std::endl
    << "name:" << name << std::endl
    << "year:" << year << std::endl
    << "zip:" << zip << std::endl;

for(const auto& i : v){
    std::cout << i << " ";
}
...