Извлечение построчно данных из файла в динамический массив в C ++

0

Я пытаюсь извлечь данные из файла и поместить его в динамический массив типа 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;
};
  • 0
    Почему бы вам не использовать getline(displayf, some_string, '\n') а затем обработать эту some_string так, как вы хотите?
  • 0
    Вы можете показать структуру DataBlock
Показать ещё 2 комментария
Теги:
arrays
struct
for-loop
file-handling

2 ответа

0

Проблема решена таким образом:

Это были звездочки, которые делали проблему, поскольку они не являются int, но переменная для извлечения строки имеет тип int

добавив это сразу после извлечения звезд, решила проблему:

displayf >> data;
        if (displayf.failbit)
        {
            cout << "***" << endl;
            displayf.clear();
            displayf.ignore(numeric_limits<streamsize>::max(), '\n');
        }
0

Для итерации файлов лучше использовать функцию 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 будет иметь строку вашего файла, цикл завершится автоматически, когда файл достигнет своего конца.

  • 0
    Спасибо за ответ. Я попробовал это. Проблема в том, что все данные в файле являются целочисленными, и все члены данных структуры также являются целыми числами. Я буду благодарен, если вы можете предложить решение.
  • 0
    Привет! Здравствуйте! Я нашел это здесь в переполнении стека о вашей проблеме, надеюсь, это поможет вам. Чтение числовых данных из текстового файла в C ++
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню