基本上我想要做的就是根据点读取每一行分开,打印每个团队的名字,对于团队的每个成员我想要打印出他们的名字和其他整数。我的代码是这样的:
int main () {
int x;
int y;
int j;
int t;
const char* pos;
const char* nam;
const char* line;
vector<const char*> v;
string str;
ifstream myfile ("data.txt");//opens file
if (myfile.is_open())//if you can open the file
{
while ( getline (myfile,str,'.') )//reads each line and breakes it apart based on the '.'
{
line=str.c_str();
v.push_back(line);//puts each field in a vector
}
myfile.close();
const char* lim="Team Name";
const char* name=v[1];
cout<<"team one"<<name<<endl;
int i=2;
while((i<v.size())&&(v[i]!=lim)){//adds the players for the first team
pos=v[i];
i++;
nam=v[i];
i++;
x=atoi(v[i]);//gets the x position from string to int
i++;
y=atoi(v[i]);//gets the y position from string to int
i++;
j=atoi(v[i]);//gets the jnum position from string to int
i++;
t=atoi(v[i]);//gets the targetline position from string to int
cout<<"position: "<<pos<<" name: "<<nam<<" x: "<<x<<" y: "<<y<<" jnum: "<<j<<" targ: "<<t<<endl;
i++;
}
i++;
const char* name2=v[i];
cout<<"team two"<<name2<<endl;
i++;
lim="end";
while((i<v.size())&&(v[i]!=lim)){//adds the players for the second team
pos=v[i];
i++;
nam=v[i];
i++;
x=atoi(v[i]);//gets the x position from string to int
i++;
y=atoi(v[i]);//gets the y position from string to int
i++;
j=atoi(v[i]);//gets the jnum position from string to int
i++;
t=atoi(v[i]);//gets the targetline position from string to int
cout<<"position: "<<pos<<" name: "<<nam<<" x: "<<x<<" y: "<<y<<" jnum: "<<j<<" targ: "<<t<<endl;
i++;
}
return 0;
}
}
但是我的代码没有正确读取所有内容,最后它为每个const char *打印一个空白,为每个int打印0。我之前用字符串而不是const char *尝试过类似的代码,但是在读取和打印数据后program.exe停止工作。有了这个方法,program.exe并没有停止工作,但就像我提到的那样它无法正常工作。有人有解决方案吗?
答案 0 :(得分:0)
在此while
中:
while (getline(myfile,str,'.'))//reads each line and breakes it apart based on the '.'
{
line=str.c_str();
v.push_back(line);//puts each field in a vector
}
您设置指针变量const char* line
。但它包含从str
获得的地址,每次可能具有相同的地址。
所以你最终会得到一个指针向量(可能)指向同一个东西。
每次都不会改变,因为它从文件中读取一个新字符串 每一次?
它指向的值确实发生了变化,但无法保证编译器将使用新指针。实际上,当str
超出范围时,我们现在有一个指向不保证存在的东西的指针。我们在未定义的行为列车上,这是一辆你不想上的火车。至少在这个程序str
仍在范围内,但这种方法很容易出错。
如果没有,我怎么能每次更新它?
将const char*
的每个实例替换为std::string
,并在需要时使用c_str()
。