如果可以,请注意@Soravux 的回答并使用专门的库。特别是,他建议的 strtk 工具包似乎很有趣,并且只是一个标头。Boost 也可以通过至少 5 种不同的方式来实现,如果你打算使用 C++ 一段时间,它是一个值得学习的库。也就是说,所有这些解决方案都会给你的程序增加一些复杂性,而且你很可能想把这些精力花在其他地方,特别是如果你只需要一个非常简单的数字阅读器。以下是如何使用标准 C++(使用 STL,例如向量和流):
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
vector<double> &split(const string &s,
char delim, vector<double> &elems)
{
stringstream ss(s);
string item;
while (std::getline(ss, item, delim)) {
stringstream conv( item );
double number;
conv >> number;
elems.push_back(number);
}
return elems;
}
struct my_record_t{
double f1, f2, f3, f4;
};
typedef vector<my_record_t> my_record_vector_t;
int main( int argc, char* argv[])
{
stringstream in("10,20,2.0,5\n"
"4.,5.,6.,80\n"
"4.,2.,6.,70\n"
"4.,5.,6.,86\n"
"2.,5.,9.,80\n");
// Or alternatively, :
// ifstream in("myfile.csv");
// Here you store your records
my_record_vector_t mrv;
string line;
vector< double > numbers;
while( std::getline( in, line, '\n' ) )
{
numbers.clear();
split( line, ',', numbers);
my_record_t r;
r.f1 = numbers[0];
r.f2 = numbers[1];
r.f3 = numbers[2];
r.f4 = numbers[3];
mrv.push_back( r );
}
cout << mrv.size() << " records read" << endl;
return 0;
}
也许有点太长了,但它可以节省你的一天。