使用C将数据文件存储到双维数组中

时间:2012-11-19 03:26:03

标签: c arrays string file

我正在尝试将字符串数据文件存储到多维数组中使用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

3 个答案:

答案 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