2010-08-22 69 views
3

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

例如文件内容

bob 
jack 
snack 

读取到载体后,

数据矢量内容

bob 
jack 
snack 

后,新的字符为 “john” 的数据矢量内容变成

bob 
jack 
snack 
john 

,但如果我再次运行该程序,然后使用命令行来添加的东西它再次跳过一个向量位置

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(); 
    } 
} 

回答

1

什么可能发生的是,最初,该文件的内容是字符串:

"bob\n" 
"jack\n" 
"snack" // no line feed 

其中,行由行,是“鲍勃”,“杰克”和“小吃”。当你写出来了“John” endl沿着这些线路,该文件的内容是:

"bob\n" 
"jack\n" 
"snack\n" 
"john\n" // line feed 

你可能会读这为“鲍勃”,“杰克”,“小吃”,“约翰”,并“”,因为在阅读“john \ n”之后,技术上还没有达到文件结束,但在下次尝试阅读时就会到达。

编辑:readData可能会为你工作:

void readData() { 
    ifstream myfile("contactlist.dat"); 
    if(myfile.is_open()){ 
     string l; 
     while(myfile >> l){ 
      data.push_back(l); 
     } 
     myfile.close(); 
    } 
} 

截至http://codepad.org/INgm757m证明,这个版本将具有相同的行为无论在contactlist.dat的最后一个字符是一个换行符。

+0

非常感谢你! – silent 2010-08-22 23:18:32

0

更新没有真的够去这里,但我怀疑readData()是添加一个空的字符串向量。试试这个:

// Put this right after readData() 
cout<<"----------data vector from file------------"<<endl; 
for (int i = 0; i < data.size();i++){ 
    cout<<"data[" << i << "]: " << data[i] << endl; 
} 

编辑:
我不熟悉你的getline版本,但它看起来好像它拿起最后CR或LF或什么的。试试这个:

void readData(){ 
    ifstream myfile("contactlist.dat"); 
    if(myfile.is_open()){ 
     while(!myfile.eof()){ 
      getline(myfile,line); 
      if(myfile.gcount()>0){ // checking for zero-length string 
       data.push_back(line); 
      } 
     } 
     myfile.close(); 
    } 
} 
+0

你是对的...你能告诉我这里有什么错吗? void readData(){ \t ifstream myfile(“contactlist.dat”); \t如果(myfile.is_open()){ \t \t而{ \t \t \t函数getline(MYFILE,线)(myfile.eof()!); \t \t \t data.push_back(line); \t \t} \t \t myfile.close(); \t} } – silent 2010-08-22 22:46:19

2

这是你的问题:

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

myfile.eof()后,你已经尝试读取超出文件的末尾才会是真实的;它不会告诉你下一次读取是否会达到EOF。所以你最后的getline不会读取任何东西(由于EOF),但是你仍然会把空的line字符串放入向量中。

写这个循环正确的方法很简单:

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

这工作,因为getline的返回值是由读取流(myfile,在这种情况下),以及输入输出流被设计成当在测试中使用时,例如if (myfile),当且仅当既未遇到错误也未遇到EOF时,它们才评估为真。用这种方式写下来,当达到EOF时,getline将返回myfile,这将在while测试中计算为false,因此线不会被推入矢量中。

该方法还具有停止读取除EOF以外的错误的文件的优点。