C ++ создает массив во временном классе

0

Вопрос новичку! Я начал небольшой проект, который загружает целочисленные значения из файла в массив. (Массив должен получить доступ случайно, поэтому я выбрал массив, а не вектор.)

Чтобы загрузить значения данных из файла, я создал класс Load/Save. Функция загрузки считывает первую строку файла, которая дает нам общее количество записей, которые должен иметь массив, а затем заполняет массив остальными значениями в этом файле.

Этот загрузочный объект создается только временно, я хочу передать данные программе и затем удалить объект.

Каков наилучший способ достичь этого? должен ли я создать массив в main() и передать объект нагрузки ссылку, и в этом случае, как я могу создать массив, чтобы он мог быть изменен для объема данных, требующих загрузки.?

вот класс загрузки/сохранения:

class FileIOClass {
public:
    FileIOClass();
    int ReadFile(char*);

private:

};

это код cpp для класса:

FileIOClass::FileIOClass() {
}

int FileIOClass::ReadFile(char* file_name) {
   string line;
   ifstream file;

   file.open(file_name, ios::in);

   cout << "Loading data...\n";

   int num_x, num_y, array_size;
   bool machine_header = false;

   if (file.is_open()) {
       while(getline(file, line)) {
             if (line.size() && machine_header == false) {
               // Load machine header information
               file >> num_x; 
               file >> num_y; 
               file >> array_size;
               machine_header = true; // machine header has now been read, set this to true.
           }
           else {
               // this is where i want to load the data from the file into an array.
               // the size of the array should be equal to the value in array_size.
           }
       }
       cout << "Loading complete!\n";
   }
   else {cout<<"File did not open!\n";}

   file.close();
   return 0;
}

и вот main.cpp:

int main(int argc, char** argv)
{
    FileIOClass data_in;
    data_in.ReadFile(argv[1]);

    return 0;
}

будет несколько других классов, которые будут обрабатывать данные, содержащиеся в массиве.

Бьюсь об заклад, в этом коде есть нагрузка нечетных ошибок новичка, пожалуйста, не стесняйтесь указывать их, лучше изучать эти вещи сейчас.

Спасибо всем!

Ян.

  • 3
    Я еще не читал вопрос, но вот что: «(к массиву нужно обращаться случайным образом, поэтому я выбрал массив, а не вектор.)» ОСТАНОВИТЕ ЗДЕСЬ. std::vector - это просто динамически растущий массив. Если вам нужен массив размера во время выполнения, используйте std::vector и покончите с этим.
  • 1
    Случайный доступ означает, что вы не используете list . Это означает, что вы должны использовать vector . Массивы редко встречаются, и они особенно вредны для начинающих.
Показать ещё 3 комментария
Теги:
arrays

3 ответа

1

Пока вы уже решили использовать класс для чтения файла, хранение данных в классе кажется разумным. добавьте элемент в этот класс для хранения данных:

class FileIOClass {
public:
     FileIOClass();
     int ReadFile(char*);
     unsigned int operator [](int i) const    {return m_data[i];}
     int size(void) { return m_data.size(); }
private:
     std::vector<int> m_data;
};

и вставьте данные в этот элемент в свой метод ReadFile:

while(getline(file, line)) {
         int pos = 0;
         if (line.size() && machine_header == false) {
           // Load machine header information
           file >> num_x; 
           file >> num_y; 
           file >> array_size;
           m_data.resize(array_size);
           machine_header = true; // machine header has now been read, set this to true.
       }
       else {
           file >> m_data[pos++];
           // this is where i want to load the data from the file into an array.
           // the size of the array should be equal to the value in array_size.
       }
   }

обратите внимание, что я перегрузил оператор [], поэтому вы можете использовать свой класс следующим образом:

int main(int argc, char** argv)
{
    FileIOClass data_in;
    data_in.ReadFile(argv[1]);
    if (data_in.size() >= 1)
       cout << data_in[0];
    return 0;
}
  • 0
    Я думаю, что могу видеть, что ты там сделал, все еще нуб, но я буду сидеть на месте и разбираться с этим. Не могу дождаться, чтобы попробовать это!
1

Что-то вроде этого может быть хорошим:

vector<int> myVector(array_size);
for(int i=0; file && i<array_size; i++) {
    file >> myVector[i];
}
0

Массив должен получить доступ случайно, поэтому я выбрал массив, а не вектор.

C++ обеспечивают эффективный произвольный доступ (они представляют собой массивы под капотом). Используйте std :: vector, если вы не профилировали свой код и не нашли его неэффективным для того, что вы делаете.

  • 0
    Эй, это приятно знать, спасибо! Я думал, что вектор можно только подтолкнуть и выскочить из. Большое спасибо!

Ещё вопросы

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