我正在尝试将字符串数据文件存储到多维数组中使用C.My示例数据如下所示。我正在考虑使用下面的char声明来存储我的数据。请告诉我是否还有其他方法
char *array[6][10];
53,v42,p11,51097,310780,ok
56,v45,p11,260,1925,ok
68,v42,p11,51282,278770,ok
77,v50,p11,46903,281485,ok
82,v46,p12,475,2600,ok
84,v48,p12,433,3395,ok
96,v49,p14,212,1545,ok
163,v50,p20,373819,1006375,ok
204,v50,p26,36917,117195,ok
241,v70,p33,21777,91360,ok
答案 0 :(得分:1)
看起来很好,如果你想让它成为字符串。
我建议不要为每个字段分配一个字符串。相反,从文件中读取一行,为其分配一个字符串,标记出逗号,并将指针存储在2D数组中。
或者实际上,如果您的数据文件很容易适合内存,则没有理由不读取整个内容和标记。实际上,您只需将数组用作缓冲区的索引。
答案 1 :(得分:1)
还有很多其他方法可以做到;一些将取决于你是否已经了解结构。
需要注意的一点是:C对数组使用'row-major'排序,因此大多数程序员会为10行(每行6列)编写char *array[10][6];
。
您可以决定不使用char *
,而是允许每个字符串使用10个字符,并使用:
char array[10][6][10];
这将适合所显示的数据(有一点空间;第二个10可能小到8,显示的数据)。这需要更少的动态内存管理。
或者,您可以定义表示一行的结构:
struct csv_line
{
int col1;
char col2[4];
char col3[4];
int col4;
int col5;
char col6[4]; // Correct length uncertain...
};
然后有一个这样的一维数组:
struct csv_line array[10];
这或多或少是我做的。请注意,该结构每行使用24个字节,而char array[10][6][8];
中每行使用48个字节,并与指针的48个字节以及64位计算机上char *
版本的实际字符串和存储开销进行比较。在64位计算机上,char指针版本的总存储容量很容易为每行144个字节。
显然,这种大小分析假设您为每个字符串分别进行了分配。如果您将每行数据读入一个单独分配的行,然后存储指向该行部分的指针,则会显着降低存储开销。很多将取决于您将如何使用数据。如果你打算把数字字段视为数字,那么我会使用这个结构;它将在以后节省数据转换。
答案 2 :(得分:0)
我希望此示例程序可以帮助您解决问题。我使用了结构和sscanf。这是解决这个问题的好方法。
#include <stdio.h>
struct data
{
char date[100];
char state[100];
char profit[100];
char revenue[100];
};
int main()
{
char line[4096] = {'\0'};
char t1[100], t2[100], t3[100], t4[100];
struct data d[2];
int i = 0;
while(fgets(line, 4096, stdin) != NULL) {
sscanf(line, "%[^','],%[^','],%[^','],%s", &t1, &t2, &t3, &t4);
strcpy(d[i].date, t1);
strcpy(d[i].state, t2);
strcpy(d[i].profit, t3);
strcpy(d[i++].revenue, t4);
}
i = 0;
while(i<2){
printf("%s %s %s %s\n", d[i].date, d[i].state, d[i].profit, d[i].revenue);
i++;
}
}
$&GT; a./exe&lt;文件
$&GT;猫文件
12/2/2012,TN,1200,14000
12/3/2012,KA,2333554,424