2016-12-20 28 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可以用来读取当前行..

但是,我将如何检查它是否是我需要的正确条目,然后再将真/假分为变量?

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

工作正常! :)你是一个圣人。我想upvote,但它说我不能? :( – Doughman54

+0

@ Doughman54,很高兴它的工作。没有需要upvote,只要接受它通过点击复选标记的答案。 – 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; 
} 

你会从文件中读取每条记录,并只处理您正在查找的记录:

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

阅读记录的好处是,当您找到名称时,您可以获得完整的信息。

另一种方法是将所有记录读入内存(如std::vector),然后搜索内存找到它。

欲了解更多的信息,搜索“stackoverflow C++读取文件CSV”的互联网。

+0

很好的解决方案。两个问题:1)你忘了“吃”每个记录的结尾分号;和2)确实>>转换真/假布尔? – dmg