0

我正在尝试使用 C 将字符串数据文件存储到多维数组中。我的示例数据如下所示。我正在考虑使用下面的 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
4

3 回答 3

1

看起来不错,如果您希望它是字符串。

我建议不要为每个字段分配一个字符串。相反,从文件中读取一行,为其分配一个字符串,标记逗号,并将指针存储在二维数组中。

或者实际上,如果您的数据文件很容易放入内存中,那么没有理由不阅读整个内容并进行标记。实际上,您只需将数组用作缓冲区的索引。

于 2012-11-19T03:30:32.940 回答
1

还有很多其他方法可以做到这一点;有些将取决于您是否已经了解了结构。

需要注意的一点:C 对数组使用“行优先”排序,因此大多数程序员会编写char *array[10][6];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 个字节,而 in 中每行char array[10][6][8];使用 48 个字节,并且与 48 个字节的指针以及char *64 位机器上的版本的实际字符串和存储开销相比。在 64 位机器上,char 指针版本的总存储空间很容易达到每行 144 个字节。

显然,这种大小分析假设您对每个字符串都有单独的分配。如果您将每行数据读入单独分配的行,然后存储指向该行各部分的指针,则存储开销(显着)减少。很大程度上取决于您将如何使用数据。如果您要将看起来像数字的字段视为数字,那么我将使用该结构;它将在以后节省数据转换。

于 2012-11-19T03:37:42.300 回答
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++;
     }
 } 

$> a./exe <文件

$> 猫文件

12/2/2012,TN,1200,14000
12/3/2012,KA,2333554,424
于 2012-11-19T05:37:48.617 回答