我在阅读文件时遇到问题,在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
答案 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