2


0

今私は使用します:

文字レコード[BUFLEN]; if(fgets(record、BUFLEN、fp)!= NULL){

/ *いくつかのコード* /

}

次のように入力から行を取得します。

都市=ボストン;名前=ボブ;年齢= 35都市=ニューヨーク;名前=マイケル;年齢=​​ 29

「\ n」まで行全体ではなく、「city = Boston」、「name = Bob」などのような別のペアになるようなCの他のものを使用できますか。

4 Answer


3


これは、scanf()を使用できる比較的まれな機会の1つのように見えます。

あなたが試すことができます:

while(fscanf(fp、 "%[^ =] =%[^;]"、name、value)== 2){if((c = fgetc(fp))== EOF);そうでなければ(c == ';')...同じ行を続ける... そうでなければ(c == '\ n')...現在の行を折り返す... そうでなければ...おめでとう - ある種のフォーマットエラー... }

代わりに、 'fgets()'を使い続けますが、これと同じようなループで 'sscanf()'を使います。

実用的なデモコード:

#include int main(void){char name [20]; char値[20]。

while(fscanf(stdin、 "%19 [^ =] =%19 [^;]"、name、value)== 2){int c; if((c = fgetc(stdin))== EOF)break;そうでなければ(c == ';')printf( "name =%s; value =%s \ n"、name、value);そうでなければ(c == '\ n')printf( "name =%s; value =%s \ n"、name、value);そうでなければfprintf(stderr、 "Ooops!\ n"); return(0); }


2


あなたはfgetcを使用して一度に1バイトそれを読むことができます。

=まで1つの配列に読み込み、次に最大まで読み込みます。別の

do {c = fgetc(pFile);}

if(c == ';')// etc

while(c!= EOF);


1


http://www.opengroup.org/onlinepubs/000095399/functions/strtok.html[strtok()]関数を調べてください。 連続して呼び出すと、文字列から各トークンが取得されます。

あなたの例を使用して:

文字レコード[BUFLEN]; if(fgets(record、BUFLEN、fp)!= NULL){char * token;

token = strtok(record、 ";"); while(token!= NULL){doSomethingWith(token);} token = strtok(NULL、 ";"); }}


0


fgets()の機能を複製することもできますが、\ nではなく、指定した区切り文字によってのみ "fget"になります。 コードは次のようになります(これは擬似コードです)。

この関数では、 "DELIM"が使用したい区切り文字です。 \ n`ではなく、; `かもしれません。

char * GOEfgets(char * buf、int BUFLEN、FILE * fp、char DELIM){int i = 0; / * counter * / int文字。

while(character = fgetc(fp))/ *ストリームから1つずつcharを取得します* / {buf [i] =(char)character; / *その文字をストリームに格納する* /

if((char)character == DELIM)/ *区切り文字に遭遇すると、* / {return buf;}を停止します。 }}

}