Здравствуйте, у меня возникли проблемы с получением моих значений для правильного чтения из CSV-файла. Я хочу заполнить вектор 1000 объектами, определенными пользователем (DetectedParticle), с их переменными, назначенными из файла. Объект имеет 4 члена переменных (x0, x1, x2, x3) типа double. В файле каждая строка должна соответствовать одной записи в векторе, и каждый столбец строки должен быть прочитан в свою соответствующую переменную в объекте.чтение дубликатов из CSV-файла в C++
формат файла, как это (за исключением комментариев):
wordswordswordswordswords
2.231,23.52,123.4,213.2 //first object to be created with these values
23213,23123,41234,45236 //second
21323,123123,123123,2435 //third
.
.
.
23434,234234,234234,234 //1000th
Проблема заключается в том, что читает только в любой другой линии в векторе. Таким образом, вектор будет иметь объект из первой строки после слов, а затем он будет иметь третью строку, но он пропустит вторую строку. В результате у меня есть вектор размером 499, а не размер 1000. Он успешно присваивает столбцу правильной переменной-члену, хотя он просто не делает этого достаточно времени! Вот фрагмент кода:
std::vector<DetectedParticle> populate(std::string file){ //DetectedParticle is my user defined type with membervariables x0,x1,x2,x3
std::vector<DetectedParticle> temp; //creates a vector of Detected Particles for later returning
std::ifstream fin("detectedpositrons.csv"); //ifstream to read from
std::string linestr; //string for the stream to be read into
if (!fin.is_open()) { std::cerr << "failed to open file\n"; } // check file is open, error message if not
fin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); //ignores first
while (std::getline(fin, linestr)){ //
int i = 0;
DetectedParticle temppart;
while (std::getline(fin,linestr,','))
{
if (i == 4){temp.push_back(temppart); break;} //when it gets to teh end of the line, past the 4th column, it breaks and should go to the next line
float holder ; //float for the string to be held in
std::istringstream(linestr) >> holder; //converts string to float
if(i == 0){ temppart.x0 = holder; i++;} //if first column, sets x0 equal to the value
else if (i == 1){ temppart.x1 = holder; i++;} //if second column, sets x1 = to value
else if (i == 2){ temppart.x2 = holder; i++;} //if 3rd column sets x2= value
else if (i == 3){ temppart.x3 = holder; i++;} //if last column it populates the last value x3 with that value.
}
}
return temp; //returns the populated vector
}
Извините, если это не так легко следовать или самый интуитивный способ для чтения файла CSV или самый хороший метод глядя, но я придумал это сам, так что следовало ожидать! Заранее спасибо!
Отступа вашего кода правильно увеличивает ваши шансы получить помощь. –
@ n.m .: действительно, это в ужасном формате. :-) – lpapp
Я стараюсь изо всех сил; _; – rooms