使用ifstream读取文件内容

时间:2016-10-28 14:59:07

标签: c++ visual-c++

我在阅读文件时遇到问题,在Windows上使用fstream打开。

std::ifstream file(file_name);
if(!file.is_open()){
  std::cerr <<  "file cannot be opened";
}
if (!file){
  std::cerr << "errors in file";
}   

std::vector<std::string> strings;
std::string str;
while (std::getline(file, str)) {
  strings.push_back(str);
}

文件成功打开并且没有错误,但使用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上这行只打印文件内容,在Windows上它不仅可以打印,还可以使文件无法访问std::getline

2 个答案:

答案 0 :(得分:3)

getline()从输入流中提取字符,直到达到换行符或delim也是一个字符,但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,还要检查文件是否已到达。

答案 1 :(得分:0)

问题在于调用

Pattern pattern = Pattern.compile(  ".*?(\\<.*\\>).*?(\\<.*\\>).*?(\\<.*\\>).*?" ); 
std::cout << file.rdbuf(); 之前

在Windows上,此行使文件无法访问std :: getline