Извлечь слова из файла и поместить их в std :: vector из std :: array ` - PullRequest
0 голосов
/ 01 августа 2020

Ниже приведен файл (ka.txt), из которого я хочу прочитать строки: -

ASD|BSD|CSdsa|ood
fmads|aok|pdski
kdijf|okmdsomf|opkasd|okd
asdas
kamkd|aoda|kked|ok

Ниже приведен код, который я написал для помещения этих данных в вектор std. :: массив .

#include <iostream>
#include <string>
#include <vector>
#include <array>
#include <fstream>
#include <sstream>
int main(){
        std::fstream file("ka.txt");
        std::vector<std::array<std::string, 4>> darr; darr.reserve(5);
        std::array<std::string, 4> istd;
        std::string * line = new std::string; std::string * word = new std::string;
        while(std::getline(file, *line)){
                std::stringstream ss(*line);
                int per = 0;
                while(!ss.eof()){
                        std::getline(ss, *&istd[per], '|');
                        per++;
                }       
                darr.emplace_back(istd);
        }       
        file.close();
        
        for(int i = 0; i < darr.size(); i++){
                for(int j = 0; j < 4; j++){
                        std::cout << darr[i][j] << "\t";
                }       
                std::cout << "\n";
        }       
  
        return 0;       
}

По сути, у меня есть вектор, который имеет std::array, и каждый std::array имеет размер 4. Итак, я читаю данные из файла с разделителем |. И я хочу сохранить каждый элемент в каждой строке текстового файла как std::array. И сохраняя эти std::array в одном векторе. Кроме того, если одна строка содержит 4 элемента, разделенных |, тогда в std::array должно быть четыре элемента. Если в строке только один элемент, то в std::array должен быть только один элемент. Поэтому, когда я запускаю этот код, я получаю следующий результат: -

ASD BSD CSdsa   ood 
fmads   aok pdski       
kdijf   okmdsomf    opkasd  okd 
asdas       opkasd  okd 
kamkd   aoda    kked    ok  

Итак, четвертая строка имеет неправильный std::array, поскольку он должен иметь только один элемент, а должен иметь только один. Как я могу этого добиться?

Кроме того, я думаю, что вероятная проблема заключается в while l oop, которое начинается со строки 12 кода.

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Это связано с тем, что массив istd используется без инициализации, поэтому данные из предыдущих строк остаются, когда они не читаются.

std::array<std::string, 4> istd;

должно быть после

while(std::getline(file, *line)){
1 голос
/ 01 августа 2020

Я проверил приведенный ниже код. Использование istd привело к неправильному выводу, так как он запоминает предыдущие значения. Я изменил его, чтобы использовать вектор вместо массива. Как указал Пол, нам не нужно использовать new для строки. Итак, удалил его.

#include <iostream>
#include <string>
#include <vector>
#include <array>
#include <fstream>
#include <sstream>
int main(){
        std::fstream file("file.txt");
        vector<vector<string>> darr;
        std::string  line,word;
        while(std::getline(file, line))
        {
            std::stringstream ss(line);
            vector<string> temp;
            string str;
            while(!ss.eof())
            {
                std::getline(ss, str, '|');
                temp.push_back(str);
            }
            darr.emplace_back(temp);
        }
        file.close();
        for(int i = 0; i < darr.size(); i++)
        {
            for(int j = 0; j < 4; j++)
                    std::cout << darr[i][j] << " ";
            printf("\n");
        }
        return 0;
}

У меня также есть сокращенная версия того же кода, если вы не хотите его хранить.

int main(){
        std::fstream file("file.txt");
        std::string  line,word;
        while(std::getline(file, line))
        {
            std::stringstream ss(line);
            vector<string> temp;
            string str;
            while(!ss.eof())
            {
                std::getline(ss, str, '|');
                std::cout << str << " ";
            }
            printf("\n");
        }
        file.close();
        return 0;
}

Вывод:

ASD BSD CSdsa ood 
fmads aok pdski  
kdijf okmdsomf opkasd okd 
asdas    
kamkd aoda kked ok
...