2013-12-23 6 views
0

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

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

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

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

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

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

private: 

}; 

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

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; 
} 

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

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

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

Ian.

+3

Я еще не прочитал вопрос, но это: «(Массив должен быть доступным наугад, поэтому я выбрал массив, а не вектор.)« ОСТАНОВИТЕ ЗДЕСЬ. «Std :: vector» - это просто динамически растущий массив. Если вам нужен массив размера времени выполнения, используйте 'std :: vector' и сделайте с ним. – Angew

+1

Случайный доступ означает, что вы не используете 'list'. Это означает, что вы должны использовать 'vector'. Редко приходится использовать массивы, и они особенно плохи для начинающих. – RichardPlunkett

+0

Чтобы добавить к тому, что @Angew сказал: если вы знаете в какой-то ранний момент, сколько элементов вам нужно, вызовите 'std :: vector :: reserve()'. Это резервирует достаточную память, так что дальнейшие вставки в массив до заданного размера не требуют переноса данных, которые в противном случае выполняли бы 'std :: vector'. – Oswald

ответ

1

Somthing, как это могло бы быть хорошим:

vector<int> myVector(array_size); 
for(int i=0; file && i<array_size; i++) { 
    file >> myVector[i]; 
} 
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

Думаю, я могу видеть, что вы там сделали, все еще нооб, но я буду сидеть и разобрать это. Не могу дождаться, чтобы попробовать это! – IWeston

0

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

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

+0

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

Смежные вопросы