2017-01-02 2 views
1

У меня возникли проблемы с созданием 2D-вектора строки, созданного путем считывания значений из текстового файла. Сначала мне казалось, что мне нужно использовать массив. однако я понял, что вектор будет гораздо более подходящим для того, чего я пытаюсь достичь.Создание 2D String Vector из текстового файла

Вот мой код до сих пор:

Я инициализируется вектор во всем мире, но не дали ему количество строк или столбцов, потому что я хочу, чтобы определить, когда мы читаем файл:

vector<vector<string>> data; 

Тестовые данные в файле под названием «тест» в настоящее время выглядит следующим образом:

test1 test2 test3 
blue1 blue2 blue3 
frog1 frog2 frog3 

Я тогда функцию, которая открывает файл и пытается скопировать строки из text.txt к вектор.

void createVector() 
{ 
    ifstream myReadFile; 
    myReadFile.open("text.txt"); 

    while (!myReadFile.eof()) { 
     for (int i = 0; i < 5; i++){ 
      vector<string> tmpVec; 
      string tmpString; 

       for (int j = 0; j < 3; j++){ 
       myReadFile >> tmpString; 
       tmpVec.push_back(tmpString); 
       } 
      data.push_back(tmpVec); 
     } 
    } 
} 

Однако при попытке проверить размер моего вектора в моей основной функции, она возвращает значение «0».

int main() 
{ 
    cout << data.size(); 
} 

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

Спасибо!

+0

[Пожалуйста, прочитайте почему использование EOF() в цикле не хорошо] (http://stackoverflow.com/questions/5605125/why- is-iostreameof-inside-a-loop-condition-thought-wrong) – PaulMcKenzie

+0

* но не дал ему количество строк или столбцов, потому что я хочу, чтобы это было определено при чтении файла: * - Так почему же вы hard-code '5' и' 3' в вашей функции 'createVector'? – PaulMcKenzie

+0

Спасибо за ваш ответ Пол. Я знаю, что максимальное количество столбцов там будет 3, однако я не знаю количество строк (потому что это то, что может быть изменено другими функциями в программе, т. Е. Добавлять и удалять элементы). – GuestUser140561

ответ

1

Вы должны использовать std::getline, чтобы сначала получить строку данных, затем извлечь каждую строку из строки и добавить в свой вектор. Это позволяет избежать вопроса while -- eof(), который был указан в комментариях.

Вот пример:

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

typedef std::vector<std::string> StringArray; 

std::vector<StringArray> data; 

void createVector() 
{ 
    //... 
    std::string line, tempStr; 
    while (std::getline(myReadFile, line)) 
    { 
     // add empty vector 
     data.push_back(StringArray()); 

     // now parse the line 
     std::istringstream strm(line); 
     while (strm >> tempStr) 
      // add string to the last added vector 
      data.back().push_back(tempStr); 
    } 
} 

int main() 
{ 
    createVector(); 
    std::cout << data.size(); 
} 

Live Example

+0

Спасибо, что нашли время, чтобы объяснить Павлу, это действительно очистило меня! Получил это отлично. – GuestUser140561

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