C++ 使用getline处理csv时行为不明确

C++ 使用getline处理csv时行为不明确,c++,C++,我在处理csv文件时遇到了一个小问题。我对C++很陌生,并且努力学习。这可能是我忽略了的一件小事,但我已经在网上搜索了答案,无法找出哪里出了问题。我正在尝试处理一个文件,该文件有多行和逗号分隔的值(虽然行尾没有逗号,但如果这有区别的话)——需要注意的是,当我刚刚试图发布文本时,它没有包含段落分隔符,我必须手动添加它——不确定这是否有区别 销售,2014年11月9日,2014年11月9日,亚马逊MKTPLACE PMTS,-8.99 销售,2014年4月10日,2014年5月10日,亚马逊MKTP

我在处理csv文件时遇到了一个小问题。我对C++很陌生,并且努力学习。这可能是我忽略了的一件小事,但我已经在网上搜索了答案,无法找出哪里出了问题。我正在尝试处理一个文件,该文件有多行和逗号分隔的值(虽然行尾没有逗号,但如果这有区别的话)——需要注意的是,当我刚刚试图发布文本时,它没有包含段落分隔符,我必须手动添加它——不确定这是否有区别

销售,2014年11月9日,2014年11月9日,亚马逊MKTPLACE PMTS,-8.99

销售,2014年4月10日,2014年5月10日,亚马逊MKTPLACE PMTS,-13.08

销售,2014年10月3日,2014年10月5日,亚马逊MKTPLACE PMTS,-9.82

销售,2014年10月2日,2014年10月3日,亚马逊MKTPLACE PMTS,-45.48

销售,2014年8月21日,2014年8月22日,亚马逊MKTPLACE PMTS,-9.99

销售,2014年11月8日,2014年11月9日,Amazon.com,-64.7

销售,2014年10月1日,2014年10月2日,APL*ITUNES.COM/BILL,-1.08

销售,2014年9月15日,2014年9月16日,APL*ITUNES.COM/BILL,-1.08

我尝试使用
getline
将每一行放入
stringstream
中,然后使用下面的代码通过逗号分隔符解析出每一行:

ifstream file("test1.csv"); 
string value, line;
while (getline(file, line)) {
    stringstream   linestream(line);
    while (getline(linestream, value, ',')) {
        cout << "Value:   " << value << endl;
    } // while
    cout << "Done Procesing" << endl;
} // while
ifstream文件(“test1.csv”);
字符串值,行;
while(getline(文件,行)){
线状流线状流(线状);
while(getline(linestream,value,,')){
cout根据描述(但在引用的文本中不可见),每行以
'\r'
(回车符)字符开头。某些系统使用行尾序列。Windows通常使用
“\r\n”
(回车符,换行符)以非
二进制模式打开文件时(即,在创建流时未传递标志
std::ios\u base::binary
时),将用单个'\n'替换。但是,对于“\n\r”序列不会发生此替换

您可以通过在创建
std::istringstream
之前替换所有
'\r'
字符来轻松验证这一理论(我在其中添加了一个
I
,因为我不明白为什么要创建读/写流):

通过此更改,除第一行外,我希望所有行的第一个字的输出如下所示:

Value:   @Sale
std::ifstream file("test1.csv"); 
for (std::string line; std::getline(file << std::ws, line); ) {
    std::istringstream   linestream(line);
    for (std::string value; std::getline(linestream, value, ','); ) {
        std::cout << "Value:   " << value << '\n';
    } // for
}
std::cout << "Done Procesing\n";
解决此问题的最简单方法是在读取行时跳过前导空格。相应的代码摘录如下所示:

Value:   @Sale
std::ifstream file("test1.csv"); 
for (std::string line; std::getline(file << std::ws, line); ) {
    std::istringstream   linestream(line);
    for (std::string value; std::getline(linestream, value, ','); ) {
        std::cout << "Value:   " << value << '\n';
    } // for
}
std::cout << "Done Procesing\n";

在语句
while(getline(linestream,value,“,”)
中,您将分隔符指定为逗号…行的末尾没有逗号。输入文件可能包含DOS样式的行结尾,它由
\r\n
序列组成。
getline()
\r
读取到
行中,因此每行的最后一个
值包含回车。@user2899162,因此它将读取到EOF,在本例中,EOF是当前行的结尾,因为
行流
只包含一行。哎哟!没有键入我的全部理论——如果文件未写入如果使用不同的行尾标识符,行尾可能不在我们认为的位置。编辑:我被打败了。@JonathanWakely:如果单词
值:
被覆盖,行尾序列显然是
\n\r
对。否则
\r
将导致不可见的回车。