2016-02-13 65 views
0

在下面的代码我不能使用std::string类。如何跳过空行不串班

我试图读取一个空行的文件,我想,当我遇到他们忽略空行。

我已经测试了用一个简单的例子,并包含空行一个虚构的文本文件中的一些想法。

int main() { 
    ifstream fin; 
    fin.open("test.txt"); 
    if(fin.fail()){ 
     cout << "Input file fail."; 
     exit(-1); 
    } 

    char line[10]; 

    while(!fin.eof()){ 
     fin.getline(line, 10); 
     if(line[0] == '\n') 
      cout << "skip" << "\n"; 
     else 
      cout << line << "\n"; 
    } 
} 

我也尝试之类的东西strlen(line) == 1,但没有到目前为止的工作。

什么问题?

+4

请参阅[为什么iostream :: eof在循环条件内被认为是错误的?](http://stackoverflow.com/q/5605125/2069064) – Barry

+0

'std :: getline()'丢弃了分隔符,这解释了为什么你的解决方案都无法运作。 –

+0

*我们不允许使用String类* - 所以还不如叫你的课程* C编程*而不是* C++编程*。 – PaulMcKenzie

回答

1

std::getline()已经负责将'\n'字符(它将被丢弃)的,line[0]将包含'\0'在一个空的输入的情况下。

只需做比较'\0'而不是'\n'

if(line[0] == '\0') 
    cout << "skip" << "\n"; 
else 
    cout << line << "\n"; 

我也尝试之类的东西strlen(line) == 1

如果是这样,不应该已经strlen(line) == 0行?

1

有两个问题与您的代码。首先是你的循环不正确。您必须检查getline()调用的结果,而不是eof()。请参阅Why is iostream::eof inside a loop condition considered wrong。这重组的循环就变成了:

while (fin.getline(line, 10)) { 
    ... 
} 

接下来,当你阅读getline()线(10似乎真的短了线),分隔符不会是身体的一部分。在阅读时,line中不会有\n。你只需要一个空字符串。所以丢弃空行的正确方法是:

while (fin.getline(line, 10)) { 
    if (line[0]) { 
     // we have contents! 
    } 
} 

还是真的,std::string只是更好的方式:

std::string line; 
while (std::getline(fin, line)) { 
    if (!line.empty()) { 
     .... 
    } 
} 
0

std::getline()丢弃的分隔符\n。但是您可能还想考虑在某些系统行上可能会被\r\n分隔。

+0

'std :: getline()'也丢弃'\ r \ n'。 –

+0

@πάνταῥεῖ如果您在不同系统之间传输文件,是否也是如此? – Zulan