gpt4 book ai didi

c++ - pushing_back 时跳过 vector 位置

转载 作者:太空狗 更新时间:2023-10-29 21:30:02 25 4
gpt4 key购买 nike

我正在将文件中的数据读入名为 data 的字符串 vector 中。对于这个数据 vector ,我通过名为 output_string 的 main push_back 一个新字符串。 Output_string 只是通过命令行传入的参数的组合。完成所有这些后,我写回我的文件(用新字符串更新文件)。但是,当我这样做时,第一个命令行参数之后的所有内容,只要再次遇到 data.push_back(output_string); 就会跳过 vector 位置。

例如文件内容

bob
jack
snack

读入 vector 后,

数据 vector 内容

bob
jack
snack

添加新字符串后,新字符串“john”数据 vector 内容变为

bob
jack
snack
john

但是如果我再次运行程序并使用命令行再次添加一些东西它会跳过一个 vector 位置

bob
jack
snack
john

peter

它会为我在第一个之后添加的所有内容执行此操作。为什么要这样做?

int main (int argc, char *argv[]){


if (argc > 6){
cout<<"[Error] too many inputs provided" << endl;
return 0;
}

commandProcess(argc,argv);

outputstringformat();
//*********
if (cominput.rem_contpos == -1){
readData(); //reads data from a file into vector data
int outlen = output_string.length();
if (outlen > 0){
data.push_back(output_string); //pushing what i had in argv to vector
}

cout<<"----------data vector------------"<<endl;
for (int i = 0; i < data.size();i++){
cout<<"data: " << data[i] << endl;
}

ofstream outfile("contactlist.dat");
number_of_contacts = data.size();
if(outfile.is_open()){
for (int i =0; i < number_of_contacts; i++){
outfile << data[i] << endl; //copying evertthing back to file, including the new argument passed to data
}
outfile.close();
}
}
return 0;
}

编辑:这也是我处理参数的方式,我将它们组合成一个字符串。我知道这可能是问题所在,但仍然看不到它...:|

void outputstringformat(){

if (cominput.name1.length() != 0 ){
output_string = cominput.name1;
}
if (cominput.name2.length() != 0 ){
output_string = output_string + " " + cominput.name2;
}
if (cominput.name3.length() != 0 ){
output_string = output_string + " " + cominput.name3;
}
if (cominput.email.length() != 0 ){
output_string = output_string + " " + cominput.email;
}
if (cominput.phone.length() != 0 ){
output_string = output_string + " " + cominput.phone;
}
}

用 reaData 更新

void readData(){
ifstream myfile("contactlist.dat");
if(myfile.is_open()){
while(!myfile.eof()){
getline(myfile,line);
data.push_back(line);
}
myfile.close();
}
}

最佳答案

这是你的问题:

while(!myfile.eof()){
getline(myfile,line);
data.push_back(line);
}

myfile.eof() 只有在您尝试读取超出文件末尾的之后才会为真;它不会告诉您下一次读取是否会到达 EOF。所以你的最后一个 getline 不会读取任何东西(由于 EOF),但是你还是会把空的 line 字符串放入 vector 中。

编写此循环的正确方法很简单:

while(getline(myfile,line)) {
data.push_back(line);
}

这是有效的,因为 getline 的返回值是从(myfile,在本例中)读取的流,并且 iostreams 被设计成当在测试,例如 if (myfile),当且仅当既没有遇到错误也没有遇到 EOF 时,它们的计算结果为 true。这样写,当到达 EOF 时,getline 将返回 myfile,它在 while 测试中的计算结果为 false,因此该行不会被插入 vector。

此方法还有一个优点是在发生 EOF 以外的错误时停止文件读取。

关于c++ - pushing_back 时跳过 vector 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3543697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com