gpt4 book ai didi

c++ - 停止回车出现在 stringstream 中

转载 作者:太空狗 更新时间:2023-10-29 21:45:11 24 4
gpt4 key购买 nike

我有一些文本解析,无论是从文件读取还是从字符串流读取,我都希望它们的行为相同。因此,我尝试使用 std::istream 来执行所有工作。在字符串版本中,我试图让它从我创建的静态内存字节数组(最初来自文本文件)中读取。假设原始文件如下所示:

4

对应的字节数组是这样的:

const char byte_array[] = { 52, 13, 10 };

其中 52 是字符 4 的 ASCII,然后是回车符,然后是换行符。

当我直接从文件中读取时,解析工作正常。

当我尝试像这样以“字符串模式”读取它时:

std::istringstream iss(byte_array);
std::istream& is = iss;

我最终将回车卡在了我使用此方法从字符串流中检索到的字符串的末尾:

std::string line;
std::getline(is, line);

这搞砸了我的解析,因为 string.empty() 方法不再在“空白”行上触发——每行至少包含一个 13回车,即使它在生成二进制数据的原始文件中为空。

为什么 ifstream 在这方面的行为与 istringstream 不同?我怎样才能让 istringstream 版本像 ifstream 版本一样丢弃回车?

最佳答案

std::ifstream 默认在文本模式下运行,这意味着它会将非 LF 行尾转换为单个 LF。在这种情况下,std::ifstream 会在 std::getline() 看到它之前删除它。

std::istringstream 不对源字符串进行任何解释,而是按字符串中的原样传递所有字节。

重要的是要注意 std::string 表示 bytes 的序列,而不是字符。通常使用 std::string 来存储 ASCII 编码的文本,但它们也可用于存储任意二进制数据。假设是,如果您已将文件中的文本读入内存,则您已经完成了任何文本转换,例如行尾标准化。

此处正确的做法是在读取文件时转换行尾。在这种情况下,看起来您正在从文件生成代码。读取文件并将其转换为代码的程序应该消除 CR 字符。

另一种方法是编写一个流包装器,它采用 std::istream 并将读取操作委托(delegate)给它,即时转换行尾。这种方法是可行的,但可能很难做到正确。 (特别是要有效地处理搜索将很困难。)

关于c++ - 停止回车出现在 stringstream 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18195703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com