区分getline中的分隔符和换行符
Differentiating between delimiter and newline in getline
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()
来查找逗号—但是,如果您的文件包含本身包含逗号的字符串,则必须逐个字符解析字符串,因为您需要区分引号文本中的逗号和未引号文本中的逗号。
你最大的问题是你的代码没有做你想做的事。
带分隔符的 getline
将n
视为我读取文档中的另一个字符。它不会在分隔符和换行符上同时拆分。
有效的方法是编写您自己的自定义拆分getline: cppreference对getline的功能有非常清晰的描述,模仿它应该很容易(并且比随意拍摄更安全,文件很复杂)。
然后返回字符串和关于为什么在第二个通道中完成解析的信息。
现在,简单地使用getline然后分割也是可行的,并且编写速度更快,并且可能更不容易引导错误。
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 在输出流中插入换行符
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- QProcess::readAllStandardOutput() 和换行符
- 如果有换行符,clang 格式不会附加大括号
- 提取后返回换行符的C++istream.get()
- 如何在出现换行符之前将多个整数作为输入?
- 正则表达式 获取两个换行符之间的文本
- 包含换行符分隔的单词的文件和C++中这些单词的字符串向量的大小是否相同?
- 在字符串中输入换行符
- 从文本文件中读取数据并删除所有换行符空格,并在 C++ 控制台中显示
- 使用 boost::spirit 将元素解析为矢量,使用分号或换行符作为分隔符
- C++ 换行符的分隔符,再次用于 :
- 使用向量按分隔符拆分字符串 - 如何按换行符拆分
- 区分getline中的分隔符和换行符