2016-05-29 3 views
-1

Я бы очень признателен за помощь здесь. Мне нужно заполнить вектор векторов строк, используя текст из входного файла. Я действительно не знаю, как начать.Заполнить вектор векторов строк из входного файла

У меня есть что-то подобное в функции для чтения в словах, но я продолжаю получать ошибку компилятора, говоря, что я не могу отбросить строку, поэтому я знаю, что я нахожусь на неправильном пути. Любая помощь будет очень высоко ценится.

ifstream input(filename); 

for (int i = 0; i < 4; i++) 
{ 

    for (int j = 0; j < 4; j++) 
    { 
    string line; 
    getline(input, line); 
    stringstream temp(line); 
    string tempWord; 
    temp >> tempWord; 
    words[i][j].push_back(tempWord); 
    } 
+1

Может быть 'words [i] [j] = tempWord;'? – songyuanyao

+0

Как вы объявили слова? –

+0

Объявлен вектор > words; и передается ссылкой на функцию, которую я использую, чтобы попытаться прочитать некоторые слова. – zettaucla

ответ

0

Если слова является vector<vector<string>> то words[i][j] получает доступ к string. То, что вы можете посмотреть, это words[i][j] = tempWord;. string также имеет функцию .push_back(), но принимает char, поэтому ошибка, которую вы получаете, заключается в том, что вы не можете нажимать на строку, push_back() для string s для добавления символов в строку. Также в зависимости от того, как вы объявили words, если вы не указали размеры, words[i][j] может быть доступен за пределами допустимого диапазона, и лучший подход состоял бы в том, чтобы сделать words[i].push_back(tempWord). Также, глядя на ваши циклы for, я не уверен в ваших намерениях, какие слова из файла вы хотите, но в настоящее время как ваш код, он будет читать в первых 16 строках файла и помещать первое «слово» из каждого в ваш words объект. Если ваше намерение состоит в том, чтобы иметь вектор векторов строки, где каждый подвектор - это слова в строке, то что-то вроде ниже может быть лучше.

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 
#include <vector> 


int main(int argc, char* argv[]) 
{ 
    std::string filename = "testfile.txt"; 
    std::ifstream input(filename.c_str()); 
    if(!input){ 
     std::cerr << "Error in opening file: " << filename << "\n"; 
     return 1; 
    } 
    std::vector<std::vector<std::string> > words; 
    std::string line; 

    while(std::getline(input, line)){ 
     std::stringstream ss; 
     ss << line; 
     std::vector<std::string> row; 
     while (!ss.eof()) { 
      std::string tempStr; 
      ss >> tempStr; 
      row.push_back(tempStr); 
     } 
     words.push_back(row); 
    } 
    //... then do something with words here 
    return 0; 
} 
+0

Большое спасибо. Я действительно не знал, как начать. Моя программа продолжала сбой, и я думаю, это потому, что мой цикл for был испорчен. Вы были правы, я пытался, чтобы подвектор был линией/предложением слов. Кроме того, как я могу получить доступ к различным словам? А для цикла? – zettaucla

+0

'words [0] [0]' будет получать доступ к первому слову в первой строке, 'слова [0] [1]' будут получать второе слово в первой строке и т. Д. Но вы также должны проверить размер, чтобы вы word.size() предоставит вам количество строк, слов [0] .size() даст вам количество слов в первой строке и т. д., или вы можете использовать .at(), который будут обращаться к элементам с проверкой диапазона, поэтому первое слово в первой строке 'words.at (0) .at (0)'. Если вы выполнили 'words.at (5) .at (0)' и не было 6 строк в файле, вы получили бы исключение std :: out_of_range, но 'words [5] [0]' только могли бы seg fault –

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