这个CSV文件假设知道每行有多少个数,也知道数据的格式,即可使用下面简单的方法实现。
我们假设每行有4个数据,依次是int,int,float,float
基本思路是:把每行的数据定为一个类型,放在vector中,方便查找使用。使用FILE读文件,fscanf快速把已知格式的数据读进来。
1 #include <iostream> 2 #include <fstream> 3 #include <vector> 4 #include <string> 5 6 using namespace std; 7 8 class csvdata{ 9 public: 10 int id; 11 int level; 12 float price; 13 float cost; 14 };//行的类定义 15 16 int main() 17 { 18 vector<csvdata> incsv; 19 csvdata intp; 20 FILE *fp; 21 fp=fopen("D:\111.csv","r");//你自己的文件路径 22 while(1){ 23 fscanf(fp,"%d,%d,%f,%f",&intp.id,&intp.level,&intp.price,&intp.cost); 24 incsv.push_back(intp); 25 if (feof(fp))break; 26 } 27 fclose(fp); 28 for(int i=0;i<incsv.size();i++) 29 { 30 cout<<incsv[i].id<<" "<<incsv[i].level<<" "<<incsv[i].price<<" "<<incsv[i].cost<<endl; 31 32 }//输出显示每行的数据 33 34 35 system("pause"); 36 return 0; 37 }
如果不知道csv每行的个数和格式类型,也可以统一用string来读取,只是比上面方法稍麻烦。
1 #include <iostream> 2 #include <fstream> 3 #include <sstream> 4 #include <string> 5 #include <vector> 6 7 using namespace std; 8 9 string Trim(string& str) 10 { 11 str.erase(0,str.find_first_not_of(" ")); 12 13 str.erase(str.find_last_not_of(" ") + 1); 14 15 return str; 16 } 17 18 int main() 19 { 20 ifstream fin("test.csv"); 21 22 string line; 23 while (getline(fin, line)) { 24 //cout << line << endl; 25 26 istringstream sin(line); 27 vector<string> fields; 28 string field; 29 while (getline(sin, field, ',')) { 30 fields.push_back(field); 31 } 32 33 string name = Trim(fields[0]); 34 string age = Trim(fields[1]); 35 string birthday = Trim(fields[2]); 36 cout << name << " " << age << " " << birthday << endl; 37 }
system("pause");
return 0;
38 }