void Data::readstock(void) { ifstream file("D:\\price.txt"); string line; vector<Data> p; while (getline(file, line)) { stringstream ss(line); Data new_pe; stock new_stock; ss >> new_stock.num >> new_stock.name >> new_stock.price1 >> new_stock.price2 >> new_stock.price3; new_pe.s.push_back(new_stock); p.push_back(new_pe); } file.close(); for (int i = 0; i < p.size(); i++) { for (int j = 0; j < p[i].s.size(); j++) { p[i].s[j].print(); } } }为甚么向量下标超出范围
时间: 2024-03-31 07:38:38 浏览: 21
在这段代码中,向量p是一个存储了Data对象的向量,而每个Data对象中都只有一个股票对象stock。在读取price.txt文件时,每读取一行就创建一个新的Data对象,并将该行数据转换为股票对象stock,将该股票对象添加到新建的Data对象的向量s中,最后将新建的Data对象添加到p向量中。
在遍历p向量中的Data对象和其中的股票对象时,循环的上限应该是p.size()和p[i].s.size(),而不是p.size()-1和p[i].s.size()-1。因为向量的下标是从0开始的,所以当循环变量i或j等于p.size()或p[i].s.size()时,就超出了向量的范围。因此应该将for循环中的条件改为i < p.size()和j < p[i].s.size()。
相关问题
void Process::readData()//构建User-Item表 { ifstream infile; infile.open("data.txt"); if (!infile.is_open()) { cout << "data.txt打开失败....." << endl;
这段代码是一个名为 `readData` 的函数,用于读取名为 "data.txt" 的文件。它首先创建一个 `ifstream` 对象 `infile`,然后调用 `open` 函数打开文件。
如果文件成功打开,它会执行接下来的代码。如果文件打开失败,它会输出一条错误消息 "data.txt打开失败....."。
这段代码的目的是检查并打开名为 "data.txt" 的文件。如果文件成功打开,可能会有后续的代码来处理读取文件的操作。如果文件打开失败,则输出错误消息并终止程序执行。
vector<Student> readUserInfo() { string newUsername, newPassword; cout << "请输入新用户名:"; cin >> newUsername; cout << "请输入新密码:"; cin >> newPassword; vector<Student> userInfos = readUserInfo(); ifstream inFile("user.txt"); if (!inFile.is_open()) { cout << "文件不存在或无法打开!" << endl; return userInfos; } for (Student userInfo : userInfos) { outFile << userInfo.id<< " " << userInfo.password << endl; } outFile.close(); }怎么修改
下面是修改后的代码示例:
```c++
vector<Student> readUserInfo() {
string newUsername, newPassword;
cout << "请输入新用户名:";
cin >> newUsername;
cout << "请输入新密码:";
cin >> newPassword;
vector<Student> userInfos;
ifstream inFile("user.txt");
if (!inFile.is_open()) {
cout << "文件不存在或无法打开!" << endl;
return userInfos;
}
Student userInfo;
while (inFile >> userInfo.id >> userInfo.password) {
userInfos.push_back(userInfo);
}
inFile.close();
ofstream outFile("user.txt", ios::app);
if (!outFile.is_open()) {
cout << "无法打开文件!" << endl;
return userInfos;
}
outFile << userInfo.id << " " << userInfo.password << endl;
outFile.close();
return userInfos;
}
```
修改后的代码中,我们将递归调用改为了循环,使用 while 循环读取文件中的所有用户信息,并将其存入 vector 中。同时,我们在函数末尾使用 ofstream 打开文件,将新的用户名和密码写入文件中,并返回更新后的用户信息 vector。请注意,我们还添加了 outFile 的定义和声明,同时,为了保证每次写入的内容不会覆盖之前的内容,我们使用了 ios::app 模式打开文件。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)