首先,只有一种换行符:'\n'
. 但是,在系统上,行结束序列由换行符"\n\r"
和回车符("\r\n"
行,但否则停留在该位置并发送回车会将头部移动到行的开头)。从外观上看,您有一个使用换行符和回车符用于不同目的的文件,但以文本模式读取文件会混淆行序列的结尾。部分谜团可能可以通过以二进制模式打开文件来解决,即std::ios_base::binary
在打开文件时添加标志。
但是,这不会改变 的行为std::getline()
:此函数最多读取第一行终止字符,默认情况下是换行符 ( '\n'
)。要读取不同字符的行,您可以将其作为附加参数传递(我使用的是非成员函数,因为它处理任意长字符串而不是成员函数读取char
数组;成员函数可以类似地使用):
std::ifstream in("file.csv", std::ios_base::binary);
for (std::string line; std::getline(in, line); ) {
std::istringstream sin(line);
for (std::string field; std::getline(sin, field, '\r'); ) {
std::cout << "field='" << field << "'\n";
}
}
根据您的描述,您的文件似乎'\r'
用作字段分隔符。通过以二进制模式打开文件然后打印各个字符及其各自的代码,这可能是最容易找到的不同之处:
std::ifstream in("file.csv", std::ios_base::binary);
for (std::istreambuf_iterator<char> it(in), end; it != end; ++it) {
std::cout << std::setw(3)
<< int(static_cast<unsigned char>(*it)) << ' ' << *it << '\n';
}
这只会打印每个字符的代码和字符本身。您应该能够找到字段分隔符的值,但我猜'\r'
正在使用。