求助:string subscript out of range

_Wanderer2199 2018-08-24 05:10:07
新手求助!
//Main.cpp
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
int main()
{
using namespace std;
ofstream outFile;
outFile.open("可修复装备.txt");
ifstream inFile;
inFile.open("Commodity.ini");
if (!inFile.is_open())
{
cout <<"打开文件\"Commodity.ini\"失败"<<endl;
cin.get();
exit(EXIT_FAILURE);
}

string sz;
string name;
string price;
getline(inFile,sz);
while (sz!="")
{
if (sz[9]=='n' && sz[10]=='a' && sz[11]=='m' && sz[12]=='e')
{
name=sz;
while (getline(inFile,sz))
{
if (sz[0]=='r' && sz[1]=='e' && sz[2]=='s' && sz[3]=='t' && sz[4]=='o' && sz[5]=='r' && sz[14]!='0')
{
price=sz;
outFile<<name<<endl<<price<<endl;
break;
}
}
}
getline(inFile,sz);
}
cout<<"Done."<<endl;
cin.get();
return 0;
}

//Commodity.ini
requestpayforcost = 10000

rebate = 100

vnetprice = -1

vnetdaypaylimit = 100



[commodity.3]

commodityid = 28076

commodityname = 胖小丁

commoditytype = 1283

itemcount = 1

item.1.id = 28076

item.1.num = 1

item.1.availperiod = -1

qprice = -1

qqgameprice = -1

qqtangprice = -1

qqpointprice = -1

restorprice = 0

saledatelimit = 0

memberrebate = 90

attribute = 0

requestpayforcost = 10000

rebate = 100

vnetprice = -1

vnetdaypaylimit = 100



[commodity.4]

commodityid = 28074

commodityname = 宝石小鬼

commoditytype = 1283

itemcount = 1

item.1.id = 28074

item.1.num = 1

item.1.availperiod = -1

qprice = -1

qqgameprice = -1

qqtangprice = -1

qqpointprice = -1

restorprice = 0

saledatelimit = 0

memberrebate = 90

attribute = 0

requestpayforcost = 10000

rebate = 100

vnetprice = -1

vnetdaypaylimit = 100

运行报错:string subscript out of range
...全文
464 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sevancheng 2018-08-27
  • 打赏
  • 举报
回复
为啥不用xml,这ini看起来好累
_Wanderer2199 2018-08-24
  • 打赏
  • 举报
回复
引用 1 楼 sghcpt的回复:
楼主,可以试试下面的代码,只供参考:
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
int main()
{
using namespace std;
ofstream outFile;
outFile.open("可修复装备.txt");
ifstream inFile;
inFile.open("Commodity.ini");
if (!inFile.is_open())
{
cout << "打开文件\"Commodity.ini\"失败" << endl;
cin.get();
exit(EXIT_FAILURE);
}

string sz;
string name;
string price;
getline(inFile, sz);
while (sz != "")
{
if (sz[9] == 'n' && sz[10] == 'a' && sz[11] == 'm' && sz[12] == 'e')
{
name = sz;
while (getline(inFile, sz))
{
if (sz[0] == 'r' && sz[1] == 'e' && sz[2] == 's' && sz[3] == 't' && sz[4] == 'o' && sz[5] == 'r')
{
if (sz[14] != '0')
{
price = sz;
outFile << name << endl << price << endl;
}
break;
}
}
}
getline(inFile, sz);
}
cout << "Done." << endl;
cin.get();
return 0;
}


还有注意,你的ini文件每行之间不应该有空行出现,应该入下面的显示:
requestpayforcost = 10000
rebate = 100
vnetprice = -1
vnetdaypaylimit = 100
[commodity.3]
commodityid = 28076
commodityname = 胖小丁
commoditytype = 1283
itemcount = 1
item.1.id = 28076
item.1.num = 1
item.1.availperiod = -1
qprice = -1
qqgameprice = -1
qqtangprice = -1
qqpointprice = -1
restorprice = 0
saledatelimit = 0
memberrebate = 90
attribute = 0
requestpayforcost = 10000
rebate = 100
vnetprice = -1
vnetdaypaylimit = 100
[commodity.4]
commodityid = 28074
commodityname = 宝石小鬼
commoditytype = 1283
itemcount = 1
item.1.id = 28074
item.1.num = 1
item.1.availperiod = -1
qprice = -1
qqgameprice = -1
qqtangprice = -1
qqpointprice = -1
restorprice = 1
saledatelimit = 0
memberrebate = 90
attribute = 0
requestpayforcost = 10000
rebate = 100
vnetprice = -1
vnetdaypaylimit = 100


在最后一行vnetdaypaylimit = 100下面应该有一行空的。这些在windows vs2013是可以的。
假如ini文件有空行呢 该怎么改...
sghcpt 2018-08-24
  • 打赏
  • 举报
回复
楼主,可以试试下面的代码,只供参考:
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
int main()
{
using namespace std;
ofstream outFile;
outFile.open("可修复装备.txt");
ifstream inFile;
inFile.open("Commodity.ini");
if (!inFile.is_open())
{
cout << "打开文件\"Commodity.ini\"失败" << endl;
cin.get();
exit(EXIT_FAILURE);
}

string sz;
string name;
string price;
getline(inFile, sz);
while (sz != "")
{
if (sz[9] == 'n' && sz[10] == 'a' && sz[11] == 'm' && sz[12] == 'e')
{
name = sz;
while (getline(inFile, sz))
{
if (sz[0] == 'r' && sz[1] == 'e' && sz[2] == 's' && sz[3] == 't' && sz[4] == 'o' && sz[5] == 'r')
{
if (sz[14] != '0')
{
price = sz;
outFile << name << endl << price << endl;
}
break;
}
}
}
getline(inFile, sz);
}
cout << "Done." << endl;
cin.get();
return 0;
}


还有注意,你的ini文件每行之间不应该有空行出现,应该入下面的显示:
requestpayforcost = 10000
rebate = 100
vnetprice = -1
vnetdaypaylimit = 100
[commodity.3]
commodityid = 28076
commodityname = 胖小丁
commoditytype = 1283
itemcount = 1
item.1.id = 28076
item.1.num = 1
item.1.availperiod = -1
qprice = -1
qqgameprice = -1
qqtangprice = -1
qqpointprice = -1
restorprice = 0
saledatelimit = 0
memberrebate = 90
attribute = 0
requestpayforcost = 10000
rebate = 100
vnetprice = -1
vnetdaypaylimit = 100
[commodity.4]
commodityid = 28074
commodityname = 宝石小鬼
commoditytype = 1283
itemcount = 1
item.1.id = 28074
item.1.num = 1
item.1.availperiod = -1
qprice = -1
qqgameprice = -1
qqtangprice = -1
qqpointprice = -1
restorprice = 1
saledatelimit = 0
memberrebate = 90
attribute = 0
requestpayforcost = 10000
rebate = 100
vnetprice = -1
vnetdaypaylimit = 100


在最后一行vnetdaypaylimit = 100下面应该有一行空的。这些在windows vs2013是可以的。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧