2012-03-29 3 views
0

私は整数で構成される64x64行列を含むtxtファイルを大量に持っています。 txtファイルは、変数を宣言するためにループを使用することはできますか?

mat_1.txt、mat_2.txt、mat_3.txt、mat_4.txt、....、mat_n.txtのような名前を持っています。

私は変数を作成し、ホストとデバイスにスペースを割り当て、txtファイルを読み込んでデバイスにコピーする必要があります。 1回のループですべてを行うことは可能ですか?

私は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 ''、2回目に '' 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

あなたはどのようなコンピュータを使用していますか?

intの64x64配列(intは4バイト、16,386バイトの配列)は、1つの行列/ファイルを含む22,500ファイルが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を使用するのではなく、配列として宣言すると、わずかな量の領域が節約されますが、それ以外は同じです。