2009-05-01 8 views
2

外部ファイル(文字列int、行ごと)からテキストを読み込むプログラムを作成しようとしています。 構造体は、main関数の外で定義されていますc、structを使用する際の問題

typedef struct Person { 
    char fname[15]; 
    char lname[20]; 
    unsigned long int birth; 
} clovek; 

私はすべての行のデータが上書きされる可能性がのように配列する「clovek」を必要としません。 ラインがでバッファリングする赤です:

fgets(buffer, 50, datafile); 

その後、私は構造体にそれを解析したいが、私の問題が生じたところつまり:

int i = 0; 
while (buffer[i] != ' ') { 
    clovek.fname[i] = buffer[i]; 
    i++; 
} 

そして、これはエラーを私を与える:予想識別子または「」「(」の前にトークン

私はまた、デバッグのためにこのコードを使用していたが、それは同様に別のエラーを与える:

printf("fname, %s\n", clovek.fname); 

エラー: 'clovek'の前に期待される表現

私はstructを使用していると誤解しています。

+1

答えの1つを除いて、どのように人々が非常に基本的なC構文を間違えることができるかという別の恐ろしい例があります。 –

+0

構造体の複雑さと要素の位置合わせに関する別の問題を追加しましょう。 Googleはあなたの友人です。 – KevinDTimm

+0

バッファオーバーフローが起こるのを待っていて、struct PersonのメンバーをCの文字列として役に立たないようにするNULL終了がないことは言うまでもありません。 – RBerteig

答えて

10

clovekstruct Personの別名です。 typedefキーワードを削除するか、コードのどこかにタイプstruct Personのオブジェクトを作成してください。現在のコードでは、次のことができます。

clovek someone; 

while (buffer[ i ]) != ' ') { 
    someone.fname[ i ] = buffer[ i ]; 
/* .. */ 
5

このステートメントは、clovekを構造体Personへのエイリアスとして定義しています。

宣言から「typedef」を削除します。このように、clovekは、Person型の変数になります:

あるいはさらに良い、変数宣言とは別の構造体宣言:

struct Person { 
    char fname[15]; 
    char lname[20]; 
    unsigned long int birth; 
}; 

struct Person clovek; 
+2

あなたはおそらく "struct Person clovek;" 2番目の行に – millimoose

+0

おっと、そうです。あまりにもC++: –

+0

これは 'struct Person clovek;'でなければなりません。 –