Я пытаюсь извлечь данные из файла и поместить его в динамический массив типа DataBlock (DataBlock is struct). Проблема в том, что данные извлекаются правильно в первой итерации цикла for, но не после. Я отлаживаю, проблема в том, что указатель не переходит к следующим строкам после первой итерации цикла for и присваивает последнее значение первой итерации всему массиву.
Теперь я понял, что проблема связана с "****" в файле, поскольку они не являются целыми числами. Но они необходимы (они помогают вычислять размер записей). Есть ли способ пропустить строки с помощью "****". ?
Вот данные в файле:
3
4
2029
23
45
459
***
1
2
2015
3
4
20
***
Когда данные перемещаются в массив и отображаются, он показывает:
3
4
2029
23
45
459
***
459
459
459
459
459
459
***
Вот код:
DataBlock *writetoarray(string uname)
{
int size;
int data;
size = SizeOfArray(uname);
cout << "size:" << size << endl;
DataBlock *ptr = new DataBlock[size];
ifstream displayf;
displayf.open(uname.c_str());
int i = 0;
for (int i = 0; i < size; i++)
{
displayf >> data;
//istream& getline(displayf >> data);
ptr[i].date = data;
cout << ptr[i].date << endl;
displayf >> data;
ptr[i].month = data;
cout << ptr[i].month << endl;
displayf >> data;
ptr[i].year = data;
cout << ptr[i].year << endl;
displayf >> data;
ptr[i].hrs = data;
cout << ptr[i].hrs << endl;
displayf >> data;
ptr[i].min = data;
cout << ptr[i].min << endl;
displayf >> data;
ptr[i].bgl = data;
cout << ptr[i].bgl << endl;
displayf >> data;
cout << "***" << endl;
}
displayf.close();
return ptr;
}//function ends
Я много искал, но не смог найти решение. Завтра будет дата представления. Я буду очень благодарен, если вы поможете мне. Пожалуйста, скажите мне, требуется ли дополнительная информация.
добавив более подробную информацию: Вот код DataBlock:
struct DataBlock
{
int date, month, year, hrs, min, bgl;
};
Проблема решена таким образом:
Это были звездочки, которые делали проблему, поскольку они не являются int, но переменная для извлечения строки имеет тип int
добавив это сразу после извлечения звезд, решила проблему:
displayf >> data;
if (displayf.failbit)
{
cout << "***" << endl;
displayf.clear();
displayf.ignore(numeric_limits<streamsize>::max(), '\n');
}
Для итерации файлов лучше использовать функцию getline. Попробуйте следующее и посмотрите, поможет ли это вам:
std::string fileLine;
while(!displayf.eof()) //Will navegate in the file until it reachs the end.
{
getline(displayf, fileLine);
//Now your file data is in fileLine variable
/*Do what your need with the data here*/
}
Для каждого интервала цикла while файлLine будет иметь строку вашего файла, цикл завершится автоматически, когда файл достигнет своего конца.
getline(displayf, some_string, '\n')
а затем обработать этуsome_string
так, как вы хотите?