2016-05-15 8 views
0

私は、Cで宝くじプログラムを書いて、前週の選択した数字を配列に読み込みたいと考えています。私は5つの列がtabulatorsで区切られているテキストファイルを持っています。私の質問は次のようになります:テキストファイルから数字を正しく読み取る方法は?

  • どうすれば列を分けるべきですか? (コンマ、セミコロン、タブレーターなど)
  • 最後の行にEOFを含める必要がありますか? (例:-1、 "EOF")これを行うには、受け入れられるか「公式な」約束がありますか?
  • 数字の読み取りにはどの機能を使用する必要がありますか?テキストファイルからデータを読み取るための適切な、あるいは「受け入れられた」方法はありますか?

「私は億万長者になる」というゲームのためにCプログラムを書いていました。その中で私は、各行を1行全体を保持するのに十分な大きさの配列に読み込む、ある種の関数を使用しました。その後、私はこのような変数にそのデータを分離:

line: "text1";"text2";"text3";"text4"endline (-> line loaded into a buffer array) 
text1 -> answer1 (until reaching the semicolon) 
text2 -> answer2 (until reaching the semicolon) 
text3 -> answer3 (until reaching the semicolon) 
text4 -> answer4 (until reaching the end of the line) 
endline -> start over, that is read a new line and separate its contents into variables. 

それは適切に働いたが、それは、プログラマには十分だったかどうかは知りません。 (私はまだプログラマーではなく、大学でコンピュータサイエンスを学んでいます)

すべての回答とアドバイスをお待ちしています。あなたの親切な助けを前にありがとう!

+0

'tabulators'は 'tabs'の基礎であり、UnicodeはU + 0009 HORIZONTAL TABULATIONとU + 000B VERTICAL TABULATIONを定義しますが、ほとんどの人は 'tabulators'や 'tabulation'ではなく 'tab' (U + 000Bの場合は 'vertical tab'を使用します)。 –

+0

コロン ':'またはセミコロン ';'は、数値データの優れた区切り文字を作成します。テキストファイルを見るときには必ずしも目に見えないので、人間の読書のためにデータをより難しくする傾向があるので、 'tabs'を使用しないことを提案します。 'fgets()'の呼び出しを使って行全体を読み込み、 'sscanf()'または 'strtok()を使ってメモリ内の行を解析することができるので、各グループのグループを改行で' \ n ' ) ' – user3629249

答えて

3

scanf()ファミリの関数は改行を気にしませんので、行を処理する場合は、最初に行を読み込んでから、sscanf()で行を処理する必要があります。 scanf()ファミリのファンクションは空白、タブ、改行などの空白も同じ意味で扱います。セパレータとしてタブを使用することもできますが、空白も機能します。明らかに、一度に1行を読み込んで処理している場合、改行は実際にはスキャンに影響を与えません。

int lottery[100][5]; 
int line; 
char buffer[4096]; 

for (line = 0; fgets(buffer, sizeof(buffer), stdin) != 0 && line < 100; line++) 
{ 
    if (sscanf(buffer, "%d %d %d %d %d", &lottery[line][0], &lottery[line][1], 
       &lottery[line][2], &lottery[line][3], &lottery[line][4]) != 5) 
    { 
     fprintf(stderr, "Faulty line: [%s]\n", line); 
     break; 
    } 
} 

これは、EOF、あまりにも多くの行、および5つの数字で始まらない障害のあるライン(1で停止し、あなたがしたい場合は、ループの中など、それらの値を確認することができます - しかし、テストは何ですか実行する必要がありますか?)。空白区切り文字を検証する場合は、より厳しく作業する必要があります。

おそらく、5つの数字の後に空白と改行をテストしたいことがあります。これは少し難解です(の変換仕様をsscanf()で参照してください)。

+0

マイナー:' line <100 && fgets(buffer、... '100行後に入力を読み込んで捨てないようにする.. – chux

+1

@chux:興味深い点。ファイル内の100行(標準入力);もしそうなら、それはスペースがあるかどうかをチェックする前にEOFになります。あなたが「マイナー」と言ったように、どちらの方法でも議論をすることができます。 –

関連する問題