Вопрос новичку! Я начал небольшой проект, который загружает целочисленные значения из файла в массив. (Массив должен получить доступ случайно, поэтому я выбрал массив, а не вектор.)
Чтобы загрузить значения данных из файла, я создал класс 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;
}
будет несколько других классов, которые будут обрабатывать данные, содержащиеся в массиве.
Бьюсь об заклад, в этом коде есть нагрузка нечетных ошибок новичка, пожалуйста, не стесняйтесь указывать их, лучше изучать эти вещи сейчас.
Спасибо всем!
Ян.
Пока вы уже решили использовать класс для чтения файла, хранение данных в классе кажется разумным. добавьте элемент в этот класс для хранения данных:
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;
}
Что-то вроде этого может быть хорошим:
vector<int> myVector(array_size);
for(int i=0; file && i<array_size; i++) {
file >> myVector[i];
}
Массив должен получить доступ случайно, поэтому я выбрал массив, а не вектор.
C++ обеспечивают эффективный произвольный доступ (они представляют собой массивы под капотом). Используйте std :: vector, если вы не профилировали свой код и не нашли его неэффективным для того, что вы делаете.
std::vector
- это просто динамически растущий массив. Если вам нужен массив размера во время выполнения, используйтеstd::vector
и покончите с этим.list
. Это означает, что вы должны использоватьvector
. Массивы редко встречаются, и они особенно вредны для начинающих.