在处理一些数据时,报错字符迭代器出错,感觉是使用stringstream的时候出错了
float x, y, z;
string xx, yy;
int n=0,r,s,t,i;
string content;
ifstream fileStream(filePath, ios::in);
string line = "";
while (!fileStream.eof()) {
getline(fileStream, line);
n = n + 1;
string u = "*Node", v = "*Element, type=C3D8R", w = "*Nset, nset=Set-1, generate";
if (line.compare(0,-1, "*Node" )== 0) {
r = n;
};
if (line.compare(0, -1, "*Element, type=C3D8R") == 0) {
s = n;
};
if (line.compare(0, -1, "*Nset, nset=Set-1, generate") == 0) {
t = n;
};
};
fileStream.clear(); //添加clear函数
fileStream.seekg(r+1);
for(i=0;i<s-r;i++){
getline(fileStream, line);
stringstream ss(line.erase(0,2)),sss;
ss >> xx; xx.erase(xx.end(), xx.end() + 1); sss << xx; sss >> x;
ss >> yy; yy.erase(yy.end(), yy.end() + 1); sss << yy; sss >> y;
ss >> z;
vertVals.push_back(x);
vertVals.push_back(y);
vertVals.push_back(z);
}
//if (line.compare(0, 2, "vt") == 0) {
//stringstream ss(line.erase(0, 2));
//ss >> x; ss >> y;
//stVals.push_back(x);
//stVals.push_back(y);
//}
//if (line.compare(0, 2, "vn") == 0) {
//stringstream ss(line.erase(0, 2));
//ss >> x; ss >> y; ss >> z;
//normVals.push_back(x);
//normVals.push_back(y);
//normVals.push_back(z);
//}
for (i = 0; i < r- n; i++){
string oneCorner, v, t, n;
stringstream ss(line.erase(0, 2));
for (int i = 0; i < 3; i++) {
getline(ss, oneCorner, ',');
stringstream oneCornerSS(oneCorner);
getline(oneCornerSS, v, '/');
//getline(oneCornerSS, t, '/');
//getline(oneCornerSS, n, '/');
int vertRef = (stoi(v) - 1) * 3;
//int tcRef = (stoi(t) - 1) * 2;
//int normRef = (stoi(n) - 1) * 3;
//front1
triangleVerts.push_back(vertVals[vertRef+4]);
triangleVerts.push_back(vertVals[vertRef + 7]);
triangleVerts.push_back(vertVals[vertRef + 3]);
//front2
triangleVerts.push_back(vertVals[vertRef + 3]);
triangleVerts.push_back(vertVals[vertRef ]);
triangleVerts.push_back(vertVals[vertRef +4]);
//back1
triangleVerts.push_back(vertVals[vertRef + 2]);
triangleVerts.push_back(vertVals[vertRef + 1]);
triangleVerts.push_back(vertVals[vertRef + 5]);
//back2
triangleVerts.push_back(vertVals[vertRef + 5]);
triangleVerts.push_back(vertVals[vertRef+6]);
triangleVerts.push_back(vertVals[vertRef + 2]);
//right1
triangleVerts.push_back(vertVals[vertRef + 2]);
triangleVerts.push_back(vertVals[vertRef + 1]);
triangleVerts.push_back(vertVals[vertRef ]);
//right2
triangleVerts.push_back(vertVals[vertRef ]);
triangleVerts.push_back(vertVals[vertRef + 3]);
triangleVerts.push_back(vertVals[vertRef + 2]);
//left1
triangleVerts.push_back(vertVals[vertRef + 4]);
triangleVerts.push_back(vertVals[vertRef + 5]);
triangleVerts.push_back(vertVals[vertRef+6]);
//left2
triangleVerts.push_back(vertVals[vertRef+6]);
triangleVerts.push_back(vertVals[vertRef + 4]);
triangleVerts.push_back(vertVals[vertRef + 7]);
//head1
triangleVerts.push_back(vertVals[vertRef + 4]);
triangleVerts.push_back(vertVals[vertRef + 1]);
triangleVerts.push_back(vertVals[vertRef + 5]);
//head2
triangleVerts.push_back(vertVals[vertRef + 4]);
triangleVerts.push_back(vertVals[vertRef + 0]);
triangleVerts.push_back(vertVals[vertRef + 1]);
//bottom1
triangleVerts.push_back(vertVals[vertRef + 3]);
triangleVerts.push_back(vertVals[vertRef + 2]);
triangleVerts.push_back(vertVals[vertRef + 6]);
//bottom2
triangleVerts.push_back(vertVals[vertRef + 6]);
triangleVerts.push_back(vertVals[vertRef + 7]);
triangleVerts.push_back(vertVals[vertRef + 3]);
//textureCoords.push_back(stVals[tcRef]);
//textureCoords.push_back(stVals[tcRef + 1]);
//normals.push_back(normVals[normRef]);
//normals.push_back(normVals[normRef + 1]);
//normals.push_back(normVals[normRef + 2]);
}
}
}
乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单,不用格式控制符!
但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。
摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream!
使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。