2016-12-05 2 views
0

Так что скажу, что я читаю 2-й массив из текстового файла, и я не знаю, какие будут измерения, что приведет меня к использованию malloc. Это, как говорится, вот моя неудачная попытка, надеюсь, вы, ребята, можете пройти и вести меня, потому что я ЛЮБЛЮ, чтобы знать, как это сделать!чтение 2-го массива из текстового файла без знания границ?

void 2dArray(double **arr, int N, int M) { 
    int i,j; 
    FILE *fp; 
    fp = fopen("array.txt", "r"); 
    for(i=0; i < N; i++) { 
    for(j=0; j < M; j++) { 
     fscanf(fp, "%lf", &arr[i][j]); 
    } 
    } 
} 

int main() { 
    int **array; 
    // How do I initialize this?? 
    // heres my attempt: 
    array = (double **)malloc(sizeof(double*); 
    2dArray(array, N, M); 
    //Where would I get N and M? 
+0

Можете ли вы прояснить эту проблему? Предположим, что ваш текстовый файл содержит 12 номеров. Как бы вы тогда выяснили, что 2D-массив содержит, скажем, 3 × 4 элемента, а не 4 × 3 (или 6 × 2, или 12 × 1 и т. Д.)? Это может помочь, если вы включили пример текстового файла в свой вопрос. –

ответ

0

Сначала вы должны выделить ресурсы с известными данными. Чтобы узнать данные, вы должны открыть файл и подсчитать размеры вашего 2d массива. Он должен выглядеть следующим образом:

int **array; 
int *n, *m,i; 
n = malloc(sizeof(int)); 
m = malloc(sizeof(int)); 
findArraySize(n,m); //will find and write array size to n and m 

//start of bad allocation method with lots of seperate resource in actual memory 
array = malloc(n*sizeof(double*)); //allocate resource for pointer to pointer 
for(i = 0 ; i < n ; i++) //allocate resource for each pointer 
    array[i] = malloc(m*sizeof(double)); 
//end of bad allocation method 

//or you can use the allocation method below for better performance and readability 
//(*array)[m] = malloc (sizeof(double[n][m])); 

2dArray(array, *n, *m); 

и ваша findArraySize функция должна быть что-то вроде этого:

void findArraySize(int* n, int *m){ 
    int i,j; 
    FILE *fp; 
    char separators[] = " "; 
    char line[256]; 
    char * p; 
    *n = 0; 
    *m = 0; 

    fp = fopen("array.txt", "r"); 

    while(!eof(fp)){ 
     fgets(line, sizeof(line), fp); 
     p = strtok(line, separators); 
     *n += 1; 
     *m = 0; //we assume array is well defined, m is same for each row 
     while (p != NULL) { 
      *m += 1; 
      p = strtok(NULL, separators); 
     } 
    } 
} 
+0

Здесь нет никакой причины использовать указатель на указатель. Просто выделите 2D-массив. 'int (* array) [m] = malloc (sizeof (int [n] [m]));'. Также нет причин для динамического распределения 'n' и' m', все, что вы достигаете, это медленная программа. – Lundin

+0

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

+0

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

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