2016-10-28 46 views
0

我有一个读取文件的问题,在Windows上打开fstream。阅读文件内容与ifstream打开

文件成功打开,它没有错误,但循环getline没有内容。

除此之外样本完美运行,并打印整个文件内容

std::copy(std::istream_iterator<std::string>(file), std::istream_iterator<std::string>(), 
      std::ostream_iterator<std::string>(std::cerr, "\n")); 

在Linux上一切都是完美的,相同的文件,同样的代码,函数getline循环读取所有。

的Visual Studio 2013

编辑:

我忘了提,我有这个代码的小线周期之前,函数getline

std::cout << file.rdbuf(); 

在Linux上这一行只是打印文件内容,在它不仅打印,但使文件无法访问到std::getline

+0

while循环后,因此,如果您打印'strings.size()'你得到零? – NathanOliver

+0

@NathanOliver yep – tty6

+2

该文件是一个文本文件吗?第一个字符是0x1A?在Windows中,有特殊字符或字节值表示文件状态结束。如果您的文件在开头*处包含这些文件,并且您没有将文件作为二进制文件打开*,则Windows操作系统将返回文件结尾状态。 –

回答

3

getline()从输入流中提取字符,直到达到换行符或delim这也是一个字符,但getline不仅仅是提取,getline放弃了删除字符。检查您的文件,看看您是否以newline character开头,这意味着您在第一条以外的文件中启动的文件。如果是这样,

while (std::getline(file, str)) { 
    strings.push_back(str); 
} 

会始终iterate only 1 time,没有返回字符,因为它只是丢弃换行符。

while (std::getline(file, str) || !file.eof) { 
    strings.push_back(str); 
} 

现在,如果它跑入deliminating character,还检查文件的结尾已经达到。

0

的问题是在呼唤

std::cout << file.rdbuf(); 

while(std::getline) 之前在Windows上线使得文件无法访问到std ::函数getline

+0

调用它的原因是什么? – Mikhail