2012-03-29 3 views
0

У меня огромное количество файлов txt, содержащих 64x64 матрицы, состоящие из целых чисел. txt-файлы имеют такие имена, как:Можно ли использовать цикл для объявления переменных?

mat_1.txt, mat_2.txt, mat_3.txt, mat_4.txt, ...., mat_n.txt.

Мне нужно создать переменную, выделить пространство на хосте и устройстве, прочитать txt-файл и скопировать на устройство. возможно ли это сделать в одном цикле?

Я знаю, как создать строку с sprintf, но не знаю, как использовать эту строку, например, для объявления переменных.

char fname[10]; 
for(int k=1; k<=n; k++) 
{ 
    sprintf(fname, "mat_%d", k); 
    int *fname; // how to say to compiler that insted of `fname` there 
        // should be `mat_1` and in next cycle `mat_2`? 
} 
+0

Фрагмент кода, который вы поставляете, если вы удаляете объявление указателя int, уже делает то, что вы хотите. Он будет обновлять 'fname', чтобы быть' 'mat_1" 'в первый раз,' mat_2 ''второй раз и т. Д. –

+0

Зачем кому-то делать что-то подобное? Имена динамических переменных уже запутаны в языках сценариев, их никто не нуждается в компилируемых языках! @JoachimPileborg: Я думаю, что он хочет создавать переменные с именем 'mat_X' динамически – ThiefMaster

+0

Если это похоже на @ThiefMaster, то нет, это невозможно. C не имеет таких функций, даже в библиотеке. –

ответ

3

Вы не можете создать имя переменной во время выполнения. Имена переменных предназначены для компилятора, и только компилятор знает и не может быть сгенерирован «на лету».

Что вам нужно, это массив. Поскольку данные уже необходимо хранить в массиве, вам нужно добавить 1 размер в свой массив.

Например, если данные в mat_1.txt является 1 одномерный массив, вы можете иметь:

int **mat;      // 2D array 
int k; 
mat = malloc(n * sizeof(*mat)); // get an array of pointers (add error checking) 
for (k = 1; k <= n; ++k) 
{ 
    char fname[20]; 
    FILE *fin; 
    sprintf(fname, "mat_%d.txt", k); 
    fin = fopen(fname, "r"); 
    if (fin == NULL) 
     /* Handle failure */ 
    /* read number of items */ 
    mat[k-1] = malloc(number of items * sizeof(*mat[k-1])); // allocate an array for each file 
    /* read data of file and put in mat[k-1] */ 
    fclose(fin); 
} 
/* At this point, data of file mat_i.txt is in array mat[i-1] */ 
/* When you are done, you need to free the allocated memory: */ 
for (k = 0; k < n; ++k) 
    free(mat[k]); 
free(mat); 
+0

Я хочу хранить файл формы данных в переменной mat_k, где k равно 1,2,3, ... проблема в том, как создать переменную в цикле? – user1281071

+1

@ user1281071 Просмотреть мое обновление – Shahbaz

+0

спасибо! Великий :) – user1281071

1

Какой компьютер вы используете?

64x64 массив из int, где int - 4 байта, представляет собой массив из 16 386 байт, 22 500 файлов с 1 матрицей/файлом - 368 640 000 байт.

Это прекрасно работает на моем 5-летний ноутбук:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 


#define MAX_FILES (22500) 
#define MAX_J (64) 
#define MAX_K (64) 

int a[MAX_FILES][MAX_J][MAX_K]; 
const char namefmt[] = "mat_%d"; 

int main (int argc, const char * argv[]) { 
    char fname[strlen(namefmt)+10+1]; // an int has 10 or less digits 
    for (int fileNumber=0; fileNumber<MAX_FILES; ++fileNumber) { 
     sprintf(fname, namefmt, fileNumber); 
     FILE* fp = fopen(fname, "r"); 
     if (fp == NULL) { 
      fprintf(stderr, "Error, can't open file %s\n", fname); 
      exit(1); 
     } 
     for (int j=0; j<MAX_J; ++j) { 
      for (int k=0; k<MAX_K; ++k) { 
       //... read the value 
      } 
     } 
     fclose(fp); 
    } 
    return 0; 
} 

Он должен работать нормально (хотя может стать мучительно медленным) на современном компьютере под управлением операционной системы с виртуальной памятью и достаточно пространства подкачки. Объявляя его как массив, вместо использования malloc сохранит минимальное количество пространства, но в остальном то же самое.

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