Рейтинг:
5
k5054
В отличие от массивов, векторы не имеют фиксированной длины. Когда вы определяете вектор как vector<type> v
, он имеет начальную длину нуля. Это означает, что если вы попытаетесь сослаться на какой-либо векторный элемент, то, скорее всего, получите сбой программы из-за попытки получить доступ к неназначенной памяти. В общем вы хотите использовать vector.push_back()
чтобы добавить элементы в конец вектора.
Попробовать это
ifstream ifile("myfile.txt");
vector<string> words;
string word;
while(ifile >> word) {
words.push_back(word);
}
Member 14594285
Я отель вотэ:
void contare(векторные<string> слова)
{
ifstream ifile("C:\\Users\\Mio\\Desktop\\ciao.txt");
строку слово;
while(ifile >> word)
{
words.push_back(слово);
}
}
тап_п()
{
векторные<строковые> слова;
контаре(слова);
но это не работает, когда я передаю ворс контаре
k5054
C++ по умолчанию использует "pass by value". Это означает, что когда у вас есть
void foo(vector<string> words)
{
...
}
int main()
{
vector<string> v;
foo(v);
}
вызов foo() создает копию вектора v и передает ее foo(). Когда foo() возвращается, копия уничтожается. То, что вы хотите сделать, это использовать pass by reference. Посмотрите ссылки в C++.
CPallini
Потом написать:
вектор <строка> contare()
{
ifstream ifile("C:\\Users\\Mio\\Desktop\\ciao.txt");
строку слово;
векторные <строковые> слова;
while(ifile >> word)
{
words.push_back(слово);
}
ответные слова;
}
и назовем это так:
тап_п()
{
вектор<строка> слова = contare();
//...
Member 14594285
большое спасибо, я решил
Рейтинг:
0
CPallini
Привет Валентина, нет необходимости явно обрабатывать открытие/закрытие файла. Вы могли бы заставить программу принимать входные данные из стандартного В и затем перенаправить предназначенные файл на программу. например
my_program < my_input_file
Кроме того, нет необходимости явно находить границы слов,
cin
может мягко сделать такую работу за вас.
Попробуй
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <string> vw; // vector of 'words'
while (true)
{
string word;
cin >> word;
if ( ! cin ) break;
vw.push_back(word);
}
cout << "count of words is " << vw.size();
}
Member 14594285
да, но таким образом я пишу всегда в строке, я хочу, чтобы вы писали только слово в vw[0], vw[1]...ecc..
k5054
Зачем делать вещи более сложными, чем они должны быть? Тем не менее, если вы настаиваете, то:
string s;
while( !fs.eof() ) {
ch = fs.get();
if(ch == ' ') {
v.push_back(s);
s.erase();
} else {
s += ch;
}
}
Обратите внимание, что и CPallini, и я дали очень похожие ответы, так что это может быть подсказкой, как опытный разработчик может подойти к проблеме. Возможно, вам стоит подумать об этом.
почему? вы хотите читать по одному символу за раз. Обратите внимание, что для больших файлов чтение отдельных символов за один раз может быть значительно медленнее, чем чтение слово за словом.