2015-11-09 5 views
-3

У меня есть файл input.txt как:Как создать массив заданных значений из файла?

n 
a1 a3 a3 an 

где n является количество элементов (размер массива), и a1a2a3an являются элементы.

Как создать массив из a1, a2, a3, an объектов? Я попытался сделать это, используя пример из вопроса this, но, насколько я понимаю, я не могу создать массив в цикле, поскольку он будет создавать его на каждой итерации.

+1

Начните с осознанием того, что C++ не имеет [массивов переменной длины] (http://en.wikipedia.org/wiki/Variable-length_array) или других динамических массивов. У этого * есть * есть ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). Затем подумайте, где вам нужно объявить этот вектор, чтобы он был доступен как внутри цикла *, так и после завершения цикла и не «воссоздан» внутри цикла. –

+0

(1) прочитайте первую строку и преобразуйте строку в целое число. (2) объявить или выделить массив (или другую подходящую структуру данных) длины 'n' (данный в (1)). (3) прочитайте следующую строку файла и проанализируйте элементы 'n' (вы не упомянули их типы, поэтому я оставляю для вас определение * parse *). Если это не поможет, я думаю, вам нужно сделать некоторые учебные пособия на C++, чтобы основываться на основах языка. Например, вы можете выполнить поиск в Интернете на «C++ чтение данных из файла». – lurker

+1

Поскольку 'n' известно заранее, одно динамическое распределение также делает трюк. Но я уверен, что у вас нет высоких требований к производительности, поэтому просто придерживайтесь 'vector' и, возможно, используйте' reserve'. –

ответ

3

Просто создайте vector, что-то вроде этого:

ifstream fin("inout.txt", ios::in | ios::binary); 
int n; 
fin >> n; 
vector<int> v; 
int m; 
while (n--) { 
    fin >> m; 
    v.push_back(m); 
} 

Тогда вы всегда можете получить массив из

int *array = v.data(); 
1

Предполагая, что a1, a2, a3, an являются целыми числами, как

4 
1 2 3 4 

Пример реализации:

#include <cstdio> 

int main(void) { 
    int n; 
    int *a; 
    FILE* fp; 

    // read the text and create an array 
    fp = fopen("input.txt", "r"); 
    if (fp == NULL) return 1; 
    if (fscanf(fp, "%d", &n) != 1) return 1; 
    a = new int[n]; 
    for (int i = 0; i < n; i++) { 
     if (fscanf(fp, "%d", &a[i]) != 1) return 1; 
    } 
    fclose(fp); 

    // print the array for checking 
    for (int i = 0; i < n; i++) printf("%d\n", a[i]); 

    delete[] a; 
    return 0; 
} 
1

но, как я понимаю, что я не могу создать массив в цикле как он будет создавать его на каждой итерации.

Вы правы.

Если вы не хотите создавать новый массив на каждой итерации, не создавайте массив в цикл. Создайте его снаружи петля.

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