2012-05-08 4 views
0

У меня есть этот кусок кода:векторные значения присвоить

while(fileStream>>help) 
    { 
     MyVector.push_back(help); 
    } 

... и позволяет сказать, что в файле «FileStream» 1 предложение: Сегодня солнечный день. Теперь, когда я это делаю:

for(int i=0;i<MyVector.size();i++) 
    { 
     printf("%s\n", MyVector[i]); 
    } 

, resoult is «день день день день день». И, конечно же, это не должно быть так. Переменные объявляются следующим образом:

char *help; 
    vector<char*> MyVector; 

EDIT: я понимаю, ответы, спасибо ... но есть ли способ хранения слов из файла в vector<char*> MyVector (как я хотел в первую очередь). это было бы здорово для остальной части моей программы.

+1

Использование 'std :: vector ' похоже на попытку установить квадратную привязку через круглое отверстие, они просто не подходят друг другу. –

ответ

6

Когда вы делаете fileStream>>help, это не меняет значение указателя, оно переписывает содержимое строки, на которую указывает указатель. Таким образом, вы повторяете один и тот же указатель на вектор снова и снова. Таким образом, все указатели в векторе указывают на одну и ту же строку. И поскольку последнее, что записано в эту строку, было словом «день», это то, что вы получаете, когда вы печатаете каждый элемент вашего вектора.

Используйте вектор std::string вместо:

string help; 
vector<string> MyVector; 

Если, как вы говорите, вы должны придерживаться vector<char*>, то вам придется динамически выделять новую строку для каждого элемента. Вы не можете безопасно использовать char* с operator>>, потому что нет возможности рассказать ему, сколько места у вас на самом деле есть в вашей строке, поэтому я буду использовать std::string для хотя бы для ввода.

std::string help; 
vector<char*> MyVector; 

while (fileStream>>help) { 
    char * p = new char[help.size() + 1]; 
    strcpy(p, help.c_str()); 
    MyVector.push_back(p); 
} 

Конечно, когда вы закончите с вектором, вы не можете просто позволить ему выйти из сферы действия. Вам нужно удалить каждый элемент вручную в цикле. Тем не менее, это все еще не полностью безопасно, потому что распределение памяти может вызвать исключение, вызывая любые строки, которые вы уже выделили, и помещаете вектор в утечку. Таким образом, вы действительно должны обернуть это все в блок try и быть готовы поймать std::bad_alloc.

Это очень много хлопот. Если бы вы могли объяснить, почему, по вашему мнению, вам нужно использовать vector<char*>, я уверен, кто-то может показать вам, почему вы этого не делаете.

+0

Я понимаю, спасибо ... но есть ли способ сохранить слова из файла в векторе MyVector (как будто я хотел в первую очередь). это было бы здорово для остальной части моей программы. – user1069738

+1

@ user1069738, Что-то не так с использованием 'c_str()'? – chris

+0

большое спасибо :) – user1069738

3

Thats, потому что ваши char * все указывают на один и тот же объект. Указатель help и указатели, хранящиеся в векторе, указывают на один и тот же объект. Каждый раз, когда вы читаете из потока, он изменяет то, на что указывают все указатели. Изменить char* на std::string.

Смежные вопросы