Я очень плохо знаком с C ++.
Я пытаюсь заполнить вектор элементами из файла с разделителями табуляции. Какой самый простой способ сделать это?
Спасибо!
Там может быть много способов сделать это, простой поиск Google даст вам решение.
Вот пример из одного из мои проекты. Оно использует getline
и читать файл, разделенный запятыми (CSV), я позволю вам изменить его для чтения файла с разделителями табуляции.
ifstream fin(filename.c_str());
string buffer;
while(!fin.eof() && getline(fin, buffer))
{
size_t prev_pos = 0, curr_pos = 0;
vector<string> tokenlist;
string token;
// check string
assert(buffer.length() != 0);
// tokenize string buffer.
curr_pos = buffer.find(',', prev_pos);
while(1) {
if(curr_pos == string::npos)
curr_pos = buffer.length();
// could be zero
int token_length = curr_pos-prev_pos;
// create new token and add it to tokenlist.
token = buffer.substr(prev_pos, token_length);
tokenlist.push_back(token);
// reached end of the line
if(curr_pos == buffer.length())
break;
prev_pos = curr_pos+1;
curr_pos = buffer.find(',', prev_pos);
}
}
ОБНОВЛЕНИЕ: улучшено в то время как состояние.
Это, вероятно, самый простой способ сделать это, но подход vcp может быть более эффективным.
std::vector<string> tokens;
std::string token;
while (std::getline(infile, token, '\t')
{
tokens.push_back(token);
}
Готово. Вы можете фактически сократить это до трех строк кода с помощью входной итератор и задняя вставка, но почему?
Теперь, если файл разрезан на строки и разделен вкладками на этих строках, вам также придется обрабатывать разделители строк. Теперь вы просто делаете вышеупомянутое дважды, один цикл для строк и внутренний цикл для разбора вкладок.
std::vector<string> tokens;
std::string line;
while (std::getline(infile, line)
{
std::stringstream instream(line)
std::string token;
while (std::getline(instream, token, '\t')
{
tokens.push_back(token);
}
}
А если вам нужно было сделать строку, то вкладки, то … я не знаю … цитаты? Три петли. Но если честно, к трем я, наверное, смотрю конечный автомат. Я сомневаюсь, что ваш учитель хочет что-то подобное на данном этапе.