区分getline中的分隔符和换行符

Differentiating between delimiter and newline in getline

本文关键字:换行符 分隔符 getline 区分      更新时间:2023-10-16
ifstream file;
file.open("file.csv");
string str;
while(file.good())
{
    getline(file,str,',')
    if (___) // string was split from delimiter 
    {
        [do this]
    }
    else // string was split from eol
    {
        [do that]
    }
}
file.close();

我想从csv文件中读取,并区分当字符串由于新行而被分割时发生的情况,以及当它由于所需的分隔符而被分割时发生的情况-即填写上面示例代码中的___

我能想到的方法有:

(1)在原文件的每行末尾手动添加一个字符,

(2)通过写入另一个文件

,自动在每行末尾添加一个字符

(3)使用不带分隔符的getline,然后创建一个函数以','分隔结果字符串。

但是有没有更简单或直接的解决方案呢?

(我看到以前也有人问过类似的问题,但我没有看到任何解决方案)

我对代码清晰度的偏好是使用您的选项3)-使用getline()与标准'n'分隔符逐行将文件读取到缓冲区中,然后使用像strtok()这样的标记器(如果您想在C级别上工作)或boost::tokenizer来解析您从文件中读取的字符串。

您在这里实际上处理了两个不同的步骤,首先将行读入缓冲区,然后将缓冲区分开以提取您需要的组件。您的代码应该反映这一点,并且通过这样做,您还可以避免必须处理奇怪的状态,例如您所描述的那些最终不得不进行额外解析的状态。

没有简单的方法来确定"哪个分隔符终止字符串",并且它被getline"消耗",因此它对您来说是丢失的。

阅读该行,并自己解析逗号分割。您可以使用std::string::find()来查找逗号—但是,如果您的文件包含本身包含逗号的字符串,则必须逐个字符解析字符串,因为您需要区分引号文本中的逗号和未引号文本中的逗号。

你最大的问题是你的代码没有做你想做的事。

带分隔符的

getlinen视为我读取文档中的另一个字符。它不会在分隔符和换行符上同时拆分。

有效的方法是编写您自己的自定义拆分getline: cppreference对getline的功能有非常清晰的描述,模仿它应该很容易(并且比随意拍摄更安全,文件很复杂)。

然后返回字符串和关于为什么在第二个通道中完成解析的信息。

现在,简单地使用getline然后分割也是可行的,并且编写速度更快,并且可能更不容易引导错误。