在名为abc.txt的文件中,我输入了以下文字:
sample text
sample text
sample text
sample text
sample text
首先,我创建了用于保存文件读取的变量(命名文本)。然后程序读取文件abc.txt。我创建了名为:ArrSent的向量,用于保存文件abc.txt中的每一行。循环结束后程序关闭文件abc.txt。然后程序必须输出从矢量ArrSent到screnn的所有句子。我有这样的问题:在程序结束后,出现警告消息:向量下标超出范围。我不知道为什么......
#include<iostream>
#include<string>
#include<fstream>
#include<vector>
using namespace std;
void function()
{
string text;//variable to save text from file
ifstream myfile("abc.txt");//reading from file colled abc.txt
vector<string> ArrSent;
if (myfile.is_open())
{
//cout <<"myplik.good()= "<< myfile.good() << endl;
while (myfile.good())
{
getline(myfile, text);
ArrSent.push_back(text);
}
myfile.close();
}
for (int i = 0; i <= ArrSent.size(); i++)
{
cout << ArrSent[i] << endl;
}
}
int main()
{
function();
system("pause");
return 0;
}
答案 0 :(得分:4)
这里错了
for (int i = 0; i <= ArrSent.size(); i++)
{
cout << ArrSent[i] << endl;
}
应该是
for (int i = 0; i < ArrSent.size(); i++)
{
cout << ArrSent[i] << endl;
}
原因是在C / C ++中,矢量/数组是基于零的。也就是说,如果你有一个向量my_vector,大小为10,就像my_vector [0],my_vector [1],... my_vector [9]。没有my_vector [10]。
迭代它的更好方法可能是(C ++ 11)
for (const auto & v : ArrSent)
{
cout << v << endl;
}
或
for (vector<string>::const_iterator i = ArrSent.begin(); i != ArrSent.end(); ++i)
cout << *i << endl;
正如WhozCraig所指出的那样,阅读的while循环也是错误的,更好的版本可能是
while (getline(myfile, text))
{
ArrSent.push_back(text);
}
关于function
值得注意:您的函数名称为function
。虽然这可能是描述性的,但您应该知道标准库头可以自由地包含其他标准库头(并且经常这样做)。标准库中的一个这样的标题是<functional>
,幸运的是,std::function
声明了它。
你为什么要关心?因为using namespace std;
将std
中的所有内容都打开,没有名称空间限定符要求,包括可能std::function
(无论您是否包含<functional>
)。
这意味着虽然这仍然会编译:
void function()
{
// .. stuff
}
这可能不是:
int main()
{
function(); // HERE
//... other stuff
}
这不知道您是否正在调用您的函数或尝试实例化std::function<>
类型的单个临时值(无论如何都不能,因为没有描述模板参数)。结果可能是不明确的。
您可以在::function();
中使用main()
来解决此问题,但如果您养成了不在通过{{1}的整个std
库中啜饮的习惯会更好和/或不使用标准库中常见类型/ ID的名称。