我需要使用带分隔符的文件中的数据填充我的多维向量,所以我想这样做:
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;
答案 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