繁体   English   中英

停止回车出现在stringstream中

[英]Stop carriage return from appearing in stringstream

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

4

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

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

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

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

当我尝试在“字符串模式”中读取它时,如下所示:

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

我最终得到的回车停留在我使用此方法从stringstream检索的字符串的末尾:

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

string.empty()了我的解析,因为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并将读操作委托给它,即时转换行结尾。 这种方法是可行的,但要做到正确可能很棘手。 (特别是,有效地处理寻求将是困难的。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM