2016-11-24 96 views
2

考虑以下代码:的std ::函数getline不会跳过空行

vector<string> parse(char* _config) { 
    ifstream my_file(_config); 
    vector<string> my_lines; 
    string nextLine; 
    while (std::getline(my_file, nextLine)) { 
     if (nextLine[0] == '#' || nextLine.empty() || nextLine == "") continue; 
     my_lines.push_back(nextLine); 
    } 
return my_lines; 
} 

和这个配置文件:

#Verbal OFF 
0 

#Highest numeric value 
100 

#Deck 
67D 44D 54D 63D AS 69H 100D 41H 100C 39H 10H 85H 7D 42S 6C 67H 61D 33D 28H 93S QH 5D 91C 40S 50C 74S 8C 98C 96C 71D 82S 75S 23D 40C 29S QC 84C 16C 80D 13H 35S 

#Players 
P1 1 
P2 2 

我的目标是解析配置文件到字符串矢量,逐行解析,忽略空行和'#'字符。

当运行在Visual Studio中的代码,输出是正确的,但在Linux上使用g运行++时,我仍然得到一些空行。

+0

确定这些线路都是空的,并且不含有可能空格或制表符? –

+1

在if语句里面'nextLine.empty()'应该是第一个条件。 – 0x499602D2

回答

5

输入文件最有可能与CR LF,即在Windows/DOS文本文件的结尾行。 Linux的期望所有线与仅LF结束,所以在Linux,std::getline()结束读取包含单个字符CR的线。

在检查nextLine内容的现有代码之前,检查该行是否非空,并以CR字符结尾,然后将其删除。然后继续您现有的if声明。