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

それを行うには他にも多くの方法があります。構造についてまだ学んだかどうかに依存するものもあります。

注意すべき1つのポイント:Cは配列に「行優先」の順序を使用するため、ほとんどのプログラマーはchar *array[10][6];それぞれ6列の10行を記述します。

を使用する代わりに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...
};

そして、これらの1次元配列があります。

struct csv_line array[10];

これは多かれ少なかれ私がそれをする方法です。構造体は、の1行あたり48バイトと比較して、1行あたり24バイトを使用し、ポインターの48バイトに加えて、64ビットマシンchar array[10][6][8];のバージョンの実際の文字列とストレージオーバーヘッドを使用することに注意してください。char *charポインターバージョンの合計ストレージは、64ビットマシンでは1行あたり144バイトになる可能性があります。

明らかに、このサイズの分析は、文字列ごとに個別の割り当てがあることを前提としています。データの各行を個別に割り当てられた行に読み込んでから、その行の一部へのポインタを格納すると、ストレージのオーバーヘッドが(劇的に)削減されます。多くは、データをどのように使用するかによって異なります。数値に見えるフィールドを数値として扱う場合は、構造を使用します。後でデータ変換を節約できます。

于 2012-11-19T03:37:42.300 に答える
1

文字列にしたい場合は、問題ないようです。

私が提案するのは、すべてのフィールドに文字列を割り当てないことです。代わりに、ファイルから行を読み取り、単一の文字列を割り当て、カンマをトークン化し、ポインターを 2D 配列に格納します。

または実際、データ ファイルがメモリに簡単に収まる場合は、全体を読み取ってトークン化しない理由はありません。事実上、配列をバッファへのインデックスとして使用するだけです。

于 2012-11-19T03:30:32.940 に答える
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 に答える