停止回车出现在字符串流中



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

4

对应的字节数组如下:

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

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

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

当我尝试在"字符串模式"下阅读时,如下所示:

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::ifstreamstd::getline()看到CR字符之前将其删除

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

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

这里的正确操作是在读取文件时转换行尾。在这种情况下,看起来就像是从文件中生成代码。读取文件并将其转换为代码的程序应该消除CR字符。

另一种方法是编写一个流包装器,该包装器接受std::istream并将读取操作委派给它,从而动态转换行尾。这种方法是可行的,但可能很难做到正确。(尤其是有效地处理搜索将是困难的。)

相关内容

  • 没有找到相关文章