c++中奇怪的getline行为

Strange getline behavior in c++

本文关键字:getline 行为 c++      更新时间:2023-10-16

我有以下文件:

BB
7.501106 5.324115
7.997006 8.287983
11.314904 11.768281
...

我100%确信这个文件是好的,我甚至用:set list:在vim中显示了换行符

BB$
7.501106 5.324115$
7.997006 8.287983$
11.314904 11.768281$
...

但当我打开并阅读第一行时,会发生一些更糟糕的事情。我有以下代码:

std::ifstream file(filename);
std::string line;
if (!file.is_open()) {
    std::cerr << "parseConfig: Error opening config file: " << filename << std::endl;
    exit(1);
}
getline(file, line);
std::cout << "line is: <" << line << ">" << std::endl;
if (line.compare("BB")) {
    std::cerr << "parseConfig: Error in config file, first line is not BB" << std::endl;
    exit(1);
}

现在我知道文件被正确打开了,因为我们一直到最后一个错误。

打印结果如下:

>ine is: <BB    //What!!!??  Why did this happen?
parseConfig: Error in config file, first line is not BB

这让我觉得很奇怪,就好像文本文件中有回车一样。但我确信没有。

有什么想法吗?

看起来该文件处于DOS模式。检查vim是否在底部显示[dos],或者检查file yourfile.txt

另一种检查方法是通过cat -A(如果您的猫没有-A,则通过cat -v)管道传输文件或程序输出。回车将显示为^M

要转换为UNIX格式,请在vim中执行:set ff=unix,然后保存文件。或者使用dos2unix命令行工具(如果有)。