2016-05-20 2 views
0

Как разбить вектор строки на C++?Как разбить массив векторных строк в C++

Значения входных строк считываются из файла, а формат - ниже.

P00 ARRIVAL:3 CPU:1 I/O:3 CPU:7 I/O:1 CPU:3 
P01 ARRIVAL:2 CPU:9 
P02 ARRIVAL:0 CPU:6 
P03 ARRIVAL:4 CPU:1 
P04 ARRIVAL:0 CPU:5 

Однако, мне нужно только значение, как,

p00 3 1 3 7 1 3 
p01 2 9 
p02 0 6 
... 

И это моя часть кода. Файл считывается по строкам, и каждая строка сохраняется в массиве векторных строк.

vector<string> procList; // file 


void readProc(char *filename) { 

    std::ifstream file(filename); 
    std::string str; 
    while (std::getline(file, str)) 
    { 
     procList.push_back(str); 
    } 

    file.close(); 

    for (int i = 0, size = procList.size(); i < size; ++i) { 
     _tprintf(TEXT("[%s] \n"), procList[i]); 
    } 
} 

Спасибо.

+1

Исправлен ли формат? Первый элемент, за которым следует список пар ключ/значение, разделенных:? –

+0

Формат фиксирован и разделен на вкладку (/ t). procList [1] = P00 (tab) ПРИБЫТИЕ: 3 (вкладка) CPU: 1 (вкладка) I/O: 3 (вкладка) CPU: 7 (вкладка) I/O: 1 (вкладка) CPU: 3 –

ответ

0

Использование регулярных выражений для синтаксического анализа:

live

#include <regex> 

std::vector<std::string> example = { 
     "P00 ARRIVAL:3 CPU:1 I/O:3 CPU:7 I/O:1 CPU:3", 
     "P01 ARRIVAL:2 CPU:9", 
     "P02 ARRIVAL:0 CPU:6", 
     "P03 ARRIVAL:4 CPU:1", 
     "P04 ARRIVAL:0 CPU:5" 
}; 
std::regex re{"[\\w\\d]+:(\\d+)"}; 
for (auto s : example) { 
    std::cout << "\n"; 
    std::regex_token_iterator<std::string::iterator> it{s.begin(), s.end(), re, 1}; 
    decltype(it) end{}; 
    while (it != end) std::cout << *it++ << ":"; 
} 

Выведет:

3:1:3:7:1:3: 
2:9: 
0:6: 
4:1: 
0:5: 

С regex_token_iterator можно также указать перебрать имя и значение в ваших данных. Вы указываете в regexp две группы (используя круглые скобки), а затем указываете в конструкторе на regex_token_iterator, какие группы (вспомогательные соответствия) следует включать во время итерации, используя: {1, 2}.

live

std::regex re{R"(([\w\d/]+):(\d+))"}; 
for (auto s : example) { 
    std::cout << "\n"; 
    using reg_itr = std::regex_token_iterator<std::string::iterator>; 
    for (reg_itr it{s.begin(), s.end(), re, {1,2}}, end{}; it != end;) { 
     std::cout << *it++ << ":"; std::cout << std::stoi(*it++) << " "; 
    } 
} 

будет выводить:

ARRIVAL:3 CPU:1 I/O:3 CPU:7 I/O:1 CPU:3 
ARRIVAL:2 CPU:9 
ARRIVAL:0 CPU:6 
ARRIVAL:4 CPU:1 
ARRIVAL:0 CPU:5 
+0

Что такое тип выхода? это строка? обугливается? Я хочу преобразовать его в значение int. Как я могу это сделать? –

+0

О, это строка, поэтому я использую stoi(); –

0

Предполагая, что формат является id {key:value}. В следующем коде используются stringstream и getline. У меня могут быть проблемы, я не тестировал.

vector<string> procList; // file 


void readProc(char *filename) { 

    std::ifstream file(filename); 
    std::string str; 
    while (std::getline(file, str)) 
    { 
     std::stringstream in(str); 
     std::stringstream out; 
     std::string temp; 

     in>>temp; 
     out<<temp; 

     while(getline(in, temp, ':')) { 
      in>>temp; 
      out<<"\t"<<temp; 
     } 

     procList.push_back(out.str()); 
    } 

    file.close(); 

    for (int i = 0, size = procList.size(); i < size; ++i) { 
     _tprintf(TEXT("[%s] \n"), procList[i]); 
    } 
} 
+0

while (getline (in, temp, ":")) <- имеет некоторую ошибку. Нужен ли ему какой-то заголовок? –

+0

вам нужны sstream fstream iostream и заголовки строк. –

+0

Также сделано небольшое исправление, разделитель для getline должен быть символом. –