【发布时间】:2018-10-25 17:41:31
【问题描述】:
这是我的代码。当我使用 '\t' 作为分隔符并带有由 \t 分隔的数据集时,它可以工作,但是当我使用 ',' 和由 ',' 分隔的数据集时,它不起作用。
void TApp::LoadTree(char * fileName){
ifstream in(fileName);
char starID[200];
double dRa,dDec,dU,dG,dR,dI,dZ;
long w = 0;
TStar * star;
if (SlimTree!=NULL){
if (in.is_open()){
cout << "\nLoading objects ";
while(in.getline(starID, 200, ',')){
in >> dRa;
in >> dDec;
in >> dU;
in >> dG;
in >> dR;
in >> dI;
in >> dZ;
in.ignore();
star = new TStar(starID, dRa, dDec, dU, dG, dR, dI, dZ);
SlimTree->Add(star);
delete star;
w++;
if (w % 10 == 0){
cout << '.';
}//end if*/
}//end while
我尝试读取的数据文件如下所示:
1237645876878180399,15.2062613727499,-1.02188584631684,-9999,-9999,-9999,-9999,-9999
【问题讨论】:
-
与您的问题无关,但我建议您停止使用流
getline成员函数,而将std::getline与std::string一起使用。 -
阅读后检查流状态以确保您正在阅读。
-
1237645876878180399,15.2062613727499,-1.02188584631684,-9999,-9999,-9999,-9999,-9999 无法按照您的阅读方式工作。读取csv文件有很多重复项。
-
无关:
star = new TStar(...); SlimTree->Add(star); delete star;不寻常。如果Add(star)存储了指针,delete star;将使存储的指针无效。如果Add(star)存储了指向数据的副本,您可以TStar star (...); SlimTree->Add(&star);避免动态分配。此外,编译器可能会找到一些额外的优化空间,特别是如果您将Add更改为接受引用而不是指针。
标签: c++ fstream ifstream getline