2016-10-15 2 views
0

半既知の形式のテキストファイルを指定します。 1行の合計文字数は1000未満です。Zintegerは通常の整数ですが、別の目的を果たします。文字列はスペースで終了します。テキストファイルを使用して構造体の配列を作成する

文字列ZInteger整数整数

文字列ZInteger整数整数整数整数

だから、数字のペアが続く数が、ペアのランダムな量に続いてその言葉。

データ構造内の各行に文字列、Zinteger、および整数のペアを格納します。

私はA [1]がString、Zinteger、整数のペアを持つ構造体になり、整数のペアを持つ別の構造体になる配列を試しました。私は何を試みたのHeres。

typedef struct { 
int num1; 
int num2; 
} ints_t; 

typedef struct { 
char term[1000]; 
int quantity(bad variable name, could be called alpha); 
ints_t *pairs; 
} info_t; 

お願いします。

EDIT:さて、私はあまりにも開いています。だから、単純な質問をするのは、私が実行可能にした2つの構造体で、どうすればそれらを実行可能にし、構造体と配列をどのようにmallocするのかです。

+0

これは多くの質問があります。正直言って、それらに答える最も簡単な方法は、コードを書くことです。これは無料のコード作成サービスではないため、私たちはしません。おそらく、構造体を読み込むことから始めて、それが正しいかどうかを調べるために印刷してから、構造体を配列に入れるようにしてください。そして、正確で、答えることができる質問をしてください(あるいは、そうではありません。あなたの個人的な質問はすべて、このサイトで複数回答えられている可能性が非常に高い - その問題は、あなたの問題を検索できるより簡単な問題に分解する) –

+1

私が選んだそれぞれの投票の理由は、**可能な回答が多すぎるか、この回答の回答が長すぎます。回答セットを絞り込むか、いくつかの段落で回答できる問題を特定するための詳細を追加してください。** –

+1

文字列とは何ですか?また、ZIntegerとは何ですか?文字列のサイズに制限はありますか?文字列はテキストファイルでどのように終了していますか? – cup

答えて

1

あなたの構造が合理的に見えます、しかし、ペアの数のカウントを格納するためのフィールドが欠落しています。

typedef struct { 
    int num1; 
    int num2; 
} int_pair_t; 

typedef struct { 
    char term[1000]; 
    int zinteger; /* so named to avoid confusion */ 
    int n_pairs; 
    int_pair_t *pairs; 
} info_t; 

が行あたり1000文字の最大を考慮すると、続く1文字の文字列を想定し空白の後に1桁の数字Zintegerが続き、332は、残りの文字に対応できる最大数のペア(1桁の数字の後に1桁の数字が続きます)です。

だから、Zintegerとペアのカウントに1つのラインからのペアが読み取られるにint_pair_t pairs[332]の固定サイズの配列だけでなく、termの文字列、およびint Sを使用することができます。行を読み終えたら、ペアデータを正確に正しいサイズの構造体info_t構造体にコピーし、その行にあるコレクションに追加することができます。

#define MAX_PAIRS 332 

typedef struct { 
    char term[1000]; 
    int zinteger; /* so named to avoid confusion */ 
    int n_pairs; 
    int_pair_t pairs[MAX_PAIRS]; 
} info_t; 

あなたは過度のメモリ使用量を気にしない場合は、mallocとコピーをスキップして、ちょうどinfo_t構造体における固定サイズの配列を割り当てることができます(これは、行ごとに3キロバイト未満です)

元の質問では、テキストファイルからデータを読み込む方法も尋ねました。ファイルから1行のデータをバッファーcharに読み込みます。次に、strtok()を使用して、スペースを区切り文字として使用してファイルのフィールドを処理することができます。必要ならばsscanf()と組み合わせて最初の2つのフィールドを抽出し、残りのフィールドはstrtokで処理することができます。

+0

ええ、固定サイズの配列を割り当てることはできますが、mallocとreallocを使って動的にメモリを割り当てる必要があります。これは、私がATMで最も困っていることです。 – Diablo

+0

@Diablo:なぜあなたは 'realloc'を使わなければなりませんか?私はあなたのアプリケーションがファイルからデータを読み込むために3KBの余裕がないとは思っていません。あなたがそれを買う余裕がないならば、あなたはファイルの行の読み込みのために一度メモリを割り当て、その後ファイルを読み込んだ後に解放することができます。 – mhawke

+0

申し訳ありませんので、私はもう一度それを読んで、1000文字の制限は、行内の各用語に対してです。申し訳ありませんので、私はどのくらいの条件があるのか​​わかりません。 Max_Pairsに適したサイズは、小さすぎたり大きすぎたりしないと思いますか? 5000のように? – Diablo

関連する問題