2014-07-25 75 views
0

(对不起,如果我的保证金充满mystakes,我会尽我所能写一些可读的)嗨,我正在研究一个函数读取文件和存储每一行​​的第一行char是“:”并删除字符串中包含的每个短划线。每次找到这种类型的行时,push_back()都被用来将这一行存储在向量中。问题是,每次使用push_back()时,向量中的所有元素都取最后一个元素的值。我不明白为什么会发生。下面的代码:std :: vector做奇怪的事情

string listContent; 
size_t dashPos; 
vector<char*>cTagsList; 
while(!SFHlist.eof()) 
{ 
    getline(SFHlist,listContent); 
    if(listContent[0]==':') 
    { 
     listContent.erase(0,1); 
     dashPos = listContent.rfind("-",string::npos); 
     while(dashPos!=string::npos) 
     { 
      listContent.pop_back(); 
      dashPos = listContent.rfind("-",string::npos); 
     } 
     char* c_listContent = (char*)listContent.c_str(); 
     cTagsList.push_back(c_listContent); 
    } 
} 

我开始还以为是与该文件的末尾,但中止搜索过程之前达到这一点给出了相同的结果有问题。

+2

首先,['而(!EOF())'是错误的。(http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)第二,将'c_str'的​​结果转换为'char *'非常糟糕。第三,只要修改字符串,该指针就无效,该字符串恰好在后面发生。使用'std :: string'的向量。无论如何,你并没有消除每一次冲刺,你会在第一次冲刺之后消除所有事情。使用'std :: remove'并将其与'erase'配对。 – chris

+3

请不要*存储'c_str'的​​结果!相反,只需要使用char *只有在处理纯c的时候,你在C++ – crashmstr

+0

char *,使用std :: string,你不必考虑太多 – blade

回答

2

的c_str() - 的std::string状态方法:

返回可以通过进一步的呼叫到该修改的对象的其他成员函数被无效的指针。

如果你允许使用一个std ::矢量<的std :: string>代替字符*的载体,你是罚款,因为会有永远的std :: string的一个副本的listContent推入矢量,即。

std::string listContent; 
size_t dashPos; 
std::vector<std::string>cTagsList; 
while(!SFHlist.eof()) 
{ 
    getline(SFHlist,listContent); 
    if(listContent[0]==':') 
    { 
     listContent.erase(0,1); 
     dashPos = listContent.rfind("-",string::npos); 
     while(dashPos!=string::npos) 
     { 
      listContent.pop_back(); 
      dashPos = listContent.rfind("-",string::npos); 
     } 
     cTagsList.push_back(listContent); 
    } 
} 

(我没有测试过)

+0

正如我回复了第一篇文章,我需要一个字符,但我会尝试通过将std :: vector 转换为char来获得它,谢谢你的帮助 – Faeralis

+0

@ Faeralis刀片已经指出了std :: string的[]运算符,它提供了对字符串中每个字符的随机访问,你可以做的另一种选择是像以前一样使用.c_str(),但是已经存储在字符串中的字符串矢量 –

+0

这就是我试过的,我工作。 – Faeralis