C ++ - 使用带分隔符的文件中的数据填充多维向量

时间:2016-10-16 12:53:44

标签: c++ readfile

我需要使用带分隔符的文件中的数据填充我的多维向量,所以我想这样做:

ifstream file;
vector < vector<string> > stockVector;
vector<string> rowVector;

file.open( fileLocation(), std::ios::in | std::ios::out );

if ( !file.good() )
    return false;

string data;
while ( getline( file, data, ';' ) ) {
    for( int i = 0; i < 20; i++ ) {
        rowVector.push_back(data);
    }

    stockVector.push_back( rowVector );
}

但我到处都是1。什么不好?
这是我的档案:

1;Guerra;36;0.95;
2;Rivas;14;3.20;
3;Petty;30;7.81;
4;Gallagher;65;8.00;
5;Nguyen;76;1.99;
6;Wooten;57;0.97;
7;Guerra;53;7.25;
8;Norman;6;5.82;
9;Dyer;72;8.69;
10;Martin;67;4.73;
11;Delgado;73;4.60;
12;Velasquez;87;1.76;
13;Crawford;95;0.66;
14;Houston;9;7.78;
15;Shaffer;85;4.40;
16;Hoover;99;0.81;
17;Webb;97;8.02;
18;Gonzales;22;1.78;
19;Gross;17;4.00;
20;Bridges;93;8.08;

1 个答案:

答案 0 :(得分:0)

这里有一些错误,包括一个微妙的错误。

1)这里需要两个getline:一个用于从文件中读取(惊讶)行直到\n,另一个用于从行读取中提取令牌。

2)第二个getline需要有;的分隔符。

3)你的两个循环相互矛盾。 while循环从文件中读取(错误地!)令牌,而另一个循环将相同的令牌添加20次。

4)(微妙的错误)你没有为文件中的每一行重置rowVector

5)硬编码20是一个坏主意,最好让getline为您找到文件和字符串的结尾。

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

int main(int argc, char **argv) {
    std::ifstream file;
    std::vector < std::vector<std::string> > stockVector;

    file.open( argv[1], std::ios::in | std::ios::out );

    if ( !file.good() )
        return false;

    for ( std::string data; getline(file, data); ) {
        std::istringstream linestr(data);
        std::vector<std::string> rowVector;
        for( std::string token; std::getline(linestr, token, ';'); ) {
            rowVector.push_back(token);
        }
        stockVector.push_back( rowVector );
    }

    for (const auto& v: stockVector ) {
        std::copy(v.cbegin(), v.cend(), std::ostream_iterator<std::string>(std::cout, " "));
        std::cout << "\n";
    }
}

参见:

http://en.cppreference.com/w/cpp/string/basic_string/getline http://en.cppreference.com/w/cpp/io/basic_stringstream http://en.cppreference.com/w/cpp/iterator/ostream_iterator