【发布时间】:2021-07-20 05:39:09
【问题描述】:
我正在通过管道从另一个进程中读取一些文本。管道将数据返回到变量chBuf,但包含许多不可打印的字符。我尝试使用擦除和删除来删除这些不可打印的字符,但抛出异常。该程序在没有此擦除删除线的情况下工作。我可能做错了什么?
ReadFile(si->child_out_r, chBuf, BUFSIZE, &dwRead, NULL);
string s(chBuf);
s.erase(remove_if(s.begin(), s.end(), [](char c) { return !isprint((unsigned)c); }), s.end());
cout << s;
【问题讨论】:
-
如果
chBuf不是以 null 结尾的,那么您将面临一段艰难时期。 -
另外,如果空值出现在您的数据中(而不是在字符串的末尾),您将不会清理第一个空值之后的数据部分。
-
@Dave 有什么解决方案吗?我不想让它扔。我应该在第一次出现空字符时截断字符串吗?
-
您可以使用
string构造函数,它采用以下长度:string s(chBuf, dwRead);现在s可能包含空值,并且它将包含所有数据。而且您的清洁过程也应该有效。另一种选择是使用vector<char> s(chBuf, dwRead);。 -
@Dave:
string s(chBuf, dwRead);就像魅力一样。您可以发布 t 作为答案吗?这样我就可以结案了。谢谢