我有大量的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 :(得分:3)
您无法在运行时创建变量名称。变量名用于编译器,只有编译器才能知道,无法动态生成。
你需要的是一个阵列。由于数据已经需要存储在数组中,因此需要为数组添加1维。
例如,如果mat_1.txt
中的数据是一维数组,则可以:
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);
答案 1 :(得分:1)
你在用什么电脑?
int的64x64数组,其中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将节省极少量的空间,但在其他方面是相同的。