2016-12-20 12 views
0

Я пытаюсь открыть текстовый файл в C++ и читать построчно, пока я не найти определенную строку, однако данные также разделить на несколько частей ...Сравнить и разделять строки в текстовом файле

текстовый файл выглядит следующим образом:

entry_one:true,true,false; 
entry_two:true,false,false; 
entry_three:false,false,false; 
entry_four:true,false,true; 

я в основном нужно прочитать текстовый файл в память, пройти через каждую строку, пока я не найти конкретную «запись _...» Я ищу, а затем мне нужно разбивать данные булева значения на переменные.

До сих пор я думал об этом:

ifstream stream; 
string line; 
stream.open(filepath); 
if (stream) 
{ 
    size_t sizepos; 
    while (stream.good()){ 
     getline(stream, line); 
    } 
} 

Приведенный выше код будет по крайней мере, открыть текстовый файл в памяти, чтобы его можно было прочитать, а затем GetLine может быть использован для чтения текущей строки .. .

Но как я могу проверить, нужна ли мне правильная запись, а потом разделил значение true/false на переменные?

E.g. найти запись двух в текстовом файле и для каждого истинного/ложного положить его в следующие переменные

bool bEntryTwo1 = false; 
bool bEntryTwo2 = false; 
bool bEntryTwo3 = false; 

Я смущен и застрял, кто-нибудь знает, что они делают, чтобы помочь мне с этим? thankss! :)

+0

Для хранения значений необходим какой-либо контейнер. – drescherjm

+0

Что это значит? – Doughman54

+0

Возможно, std :: map > – drescherjm

ответ

0

Для булевых значений я буду использовать std::vector<bool>, а не создавать отдельные логические значения. В результате, это мой подход к вашему вопросу.

#include <iostream> 
#include <string> 
#include <vector> 
#include <fstream> 


int main() 
{ 
    std::ifstream file("data.txt"); 
    std::string entry("entry_four"); 

    std::string line; 
    std::vector<bool> boolVals; 
    std::string vars; 
    while (std::getline(file, line)){ 
     int id(line.find(':')); 
     std::string temp(line.substr(0,id)); 
     if (entry == temp){ 
      vars = line.substr(id+1); 
      std::string temp1; 

      for (int i(0); i < vars.size(); ++i){ 
       if ((vars[i] != ',') && (vars[i] != ';')){ 
        temp1 += vars[i]; 
       }else{ 
        if (temp1 == "true") 
         boolVals.push_back(true); 
        else 
         boolVals.push_back(false); 

        temp1.clear(); 
       } 
      } 

     } 
    } 
    std::cout << vars << std::endl; 
    for (int i(0); i < boolVals.size(); ++i){ 
     std::cout << boolVals[i] << " "; 
    } 
     std::cout << std::endl; 


    return 0; 
} 

для этой записи entry_four:true,false,true;, у нас есть этот выход

true,false,true; 
1 0 1 

Примечание: Я проигнорировал некоторые детали в коде для простоты. Например, вам нужно дважды проверить, успешно ли открыт файл. Я оставлю вам дополнительные меры предосторожности.

+0

Это сработало! :) Ты святой. Я хочу поддержать, но это говорит, что я не могу? :( – Doughman54

+0

@ Doughman54, рад, что он сработал, нет необходимости в повышении, просто примите его ответ, нажав на галочку. – CroCo

+0

Мне нравится, как вы просто пытались помочь мне ответить на вопрос, не предлагая другие вещи (без неуважения к другие ответы, они тоже были замечательными), но вы сделали именно то, что мне нужно было с такой благодарностью :) – Doughman54

3

Я рекомендую МОДЕЛИРОВАНИЯ текстовые строки в виде записей, а затем читает каждую запись:

struct Record 
{ 
    std::string name; 
    bool  entry1; 
    bool  entry2; 
    bool  entry3; 
}; 

Далее следует добавить в operator>> читать в элементах данных:

struct Record 
{ 
    //... 
    friend std::istream& operator>>(std::istream& input, Record& r); 
}; 
std::istream& operator>>(std::istream& input, Record& r) 
{ 
    std::string name; 
    std::getline(input, r.name, ','); 
    char comma; 
    input >> r.entry1 >> comma >> r.entry2 >> comma >> r.entry3; 
    return input; 
} 

You затем прочитает каждую запись из файла и обработает только тот, который вы ищете:

Record r; 
while (my_data_file >> r) 
{ 
    if (r.name = Name_To_Find) 
    { 
    Process_Record(r); 
    break; 
    } 
} 

Преимущество чтения записи в том, что у вас есть полная информация, когда вы находите имя.

Альтернативой является чтение всех записей в памяти (например, std::vector), а затем поиск памяти для ее поиска.

Дополнительную информацию см. В Интернете для «stackoverflow C++ read file CSV».

+0

nice solutoin. два вопроса: 1) вы забыли «съесть» конечную точку с запятой каждой записи; и 2) делает >> преобразовать true/false в bool? – dmg