C++ 当我从文件中读取时,我得到了控制字符

C++ 当我从文件中读取时,我得到了控制字符,c++,c++11,C++,C++11,我试图从文件中读取,但我一直在字符串末尾获取控制字符。我使用for循环检查它们,它打印出每个单词都有一个,但前提是我将+1添加到temp.size()。我不想从文件中读取它们。我真的很困惑为什么会这样 intmain(){ 河流充填; 向量向量; 字符串temp=“”; //逐行读取文件 infle.open(“words.txt”); if(infle.is_open()) { 而(!infle.eof()) { getline(填充、温度); 矢量推回(温度); } } infle.clos

我试图从文件中读取,但我一直在字符串末尾获取控制字符。我使用
for
循环检查它们,它打印出每个单词都有一个,但前提是我将
+1
添加到
temp.size()
。我不想从文件中读取它们。我真的很困惑为什么会这样

intmain(){
河流充填;
向量向量;
字符串temp=“”;
//逐行读取文件
infle.open(“words.txt”);
if(infle.is_open())
{
而(!infle.eof())
{
getline(填充、温度);
矢量推回(温度);
}
}
infle.close();
//检查字符串的每个字符,看它是否有控制字符。
对于(int i=0;icout问题的根本原因是
for
循环正在访问
temp
字符串的空终止符(从技术上讲,在C++11之前是一种未定义的行为)。
iscntrl()
将字符
'\0'
(0x00)视为控制字符。您需要更改以下内容:

for(int j=0;j
为此:

(大小j=0;j
空终止符不是
std::string
的大小/负载的一部分,但它是为了兼容而存在的,因此
std::string
可以与基于C的API一起使用


另外,与该问题无关,您的
while
循环已中断。请参阅。您需要更换此循环:

while(!infle.eof())
{
getline(填充、温度);
矢量推回(温度);
}
为此:

while(getline(填充,临时))
{
矢量推回(温度);
}

为什么不打印代码或控制字符行中的位置?如果您在Windows上,可能是CRLF行尾作为行的一部分而不是CRLF行尾标记的一部分读取CR。在文本模式下打开此类文件会将CRLF字符对视为行尾标记。或者可以手动将其剥离。
getline()
在Windows上处理空LF和CRLF换行。@bruno非常感谢!我会查看您的帖子linked@natedawg不是我而是RemyLebeau@RemyLebeau很抱歉弄错了,谢谢!真的很感激。