我有一些问题需要帮助。这是怎么回事:
我使用以下代码将一定数量的字符读入char数组中以便稍后处理:
char str[15]; // first 16 characters that i need to get from file
std::ifstream fin("example.txt");
if(fin.is_open()){
std::cout<<"File opened successfully \n";
for(int i = 0; i<=15; i++)
{
fin.get(str[i]); //reading one character from file to array
}
}
else{
std::cout<<"Failed to open file";
}
std::cout<<str;
它适用于前4个或甚至5个字符,但当它达到8时,它会开始打印出垃圾字符。
example.txt文件的内容,我从中读取文本。
The Quick Brown Fox Jumped Over The Lazy Dog The Quick Brown Fox Jumped Over The Lazy Dog
当我读取8个字符时输出:
The Quic�j�
读取16个字符时的输出:
The Quick Brown ASCII
为什么会发生这种情况?&#39; ASCII&#39;当我尝试从文件中读取某个长度时来自?
最后,如果我想从文件中获取特定长度,我应该使用哪种代码?例如,如果我想读取前4个或8个或16个甚至20个字符?它不一定必须进入char数组,它可以保存为字符串。
提前谢谢。
答案 0 :(得分:1)
你的char数组只有15个字符。所以这条线超出范围:
for(int i = 0; i<=15; i++)
如果i
等于15
,则0
太多,因为您的数组从14
计算到0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
。
15
&lt; =算上他们!
从0
开始的14
个地方'\0'
此外,当字符串存储在内存中时,它们必须以空字符15
终止。否则打印它们的功能不知道何时停止,这可能是你的垃圾来自哪里。
因此,因为空终止符占用了 for(int i = 0; i < 14; i++)
{
fin.get(str[i]); //reading 14 characters (0-13)
}
str[14] = '\0'; // add the string terminator at the end of the array.
个空格之一,所以只留下14个从文件中读取。
所以:
{{1}}
看看是否有效。