2016-10-25 29 views
0

私は初心者のプログラマーであり、uniで勉強しています。現時点では。 私の宿題:テキストベースのアドベンチャーゲームを書く(プログラミング研究の2ヶ月未満:/)。C - ファイルからテキスト/文章を文字列に読み込む

先生は、ゲームで使用しているテキストはファイルに保存する必要があると述べました。 最初に、プログラムはそのファイルから "すべてのテキスト"を読み込み、プログラムは文字列のテキストを使うべきです(私は推測します)。

私の最初の考えは、1つの文章を1つの文字列に読み上げることでしたが、文章には単語の間にスペースが含まれているため、うまくいきたくありませんでしたが、スペースを見ると、同じ単語の代わりに別の文字列に単語を格納します。

したがって、例: 私のtxtファイルには4行あります。 1行目:どのようにすればいいですか? 2行目:フォワード 3行目:左 4行目:右

私は4弦へのテキストを読んだときに、その後、LINE 1等最初の文字列、第二でLINE 2、になることを考えました 何が起こったのですか?最初の文字列にあった「道」が2番目の文字列にありました。

悪い説明を申し訳ありませんが、私の問題が何であるか理解してくれることを願っています。 行1を最初の文字列にのみ読み込むにはどうすればよいですか?

char decisions[4][200]; 
FILE *fp; 
fp=fopen("text.txt", "r"); 
fscanf(fp, "%s %s %s %s", &decisions[0], &decisions[1], &decisions[2], &decisions[3]); 
fclose(fp); 

printf("%s\n %s\n %s\n %s\n", decisions[0], decisions[1], decisions[2], decisions[3]); 
: 私は、これは、この「エラー」を引き起こしている私のコードです

..「大丈夫、私は新しい文字列にこのスペースの後に単語を置く必要がある」として、プログラムはスペースをカウントされませんと思いました

決定[0]は、私のtxtファイルの最初の行から読み込まれた質問を持っていて、もう1つは3つのchosingオプションを持っているはずです。私は起こるしたい厥:/

+3

'fgets()'を見てください。 – EOF

+0

私はそれを見て、提案のおかげで! – Noxter

答えて

1

を改行を使用し、あなたはfgetsを使用することができます。あなたは、各文字列のMAXバイトが200であることを知って、あなたは4行を持っている場合は、このループにfgetsに渡し:

int i; 
for (i=0; i<3; i++) 
    { 
    fgets(decisions[i], 200, fp); 
    } 

fgetsは、n見つかった改行またはEOFまで、バッファにバイトを読み込みます。したがって、各行に200文字以下の文字が含まれていることを確認してください。

+1

ああ、すごくいい答え! 実際に私のコードのために書いてあります。 おかげで、これは実際にたくさんの助けになりました。今ではfgetsの使用を理解し始めます:) これは私からの決定的なupvoteです! :) ありがとう! :) – Noxter

-2

明示的に行ずつを読み取るには、書式文字列に区切り文字として

fscanf(fp, "%s[\n]%s[\n]%s[\n]%s", &decisions[0], &decisions[1], &decisions[2], &decisions[3]); 
+0

提案したソリューションを実際に試しましたか?それが動作するとは思わないでください。 '%s'に関する' fscanf'マニュアルから: "**非空白**文字のシーケンスと一致します"。 OPの入力の最初の行には空白があります。 – kaylum

+0

変換指定子 '%s'と'%[] 'を分離することができないスタックオーバーフローについて何か不思議です。最も好奇心。 – EOF

0

あなたはそうではありませんが、となります。fscanfとなります。最初の行がで解析することができtext.txt

"Whussup?" "All of the things that have not been screwn tightly to the ground" "Buh, who cares!" "You don't wanna know, mate!" 
"Why?" "Because!" "Ask Joe!" "I'm a doctor, not an engineer!" 

内容:

#include <stdio.h> 
#include <stdlib.h> 
// ALL CHECKS OMMITTED! 
int main() 
{ 
    FILE *fp; 
    char decisions[4][200]; 

    fp = fopen("text.txt", "r"); 
    fscanf(fp, "\"%199[^\"]\" \"%199[^\"]\" \"%199[^\"]\" \"%199[^\"]\"", 
     decisions[0], decisions[1], decisions[2], decisions[3]); 
    fclose(fp); 
    printf("LINE1: %s\nLINE2: %s\nLINE3: %s\nLINE4: %s\n", decisions[0], 
     decisions[1], decisions[2], decisions[3]); 
    exit(EXIT_SUCCESS); 
} 

トリックは\"%199[^\"]\"あり、それは二重の間"はないとされている199文字までかかります引用符のあとにはスペースが続きます。しかし、text.txtのフォーマットは厳密でなければならないか、動作しません!

実際には、fgetsなどを使用しようとすると、頭痛の量が大幅に減ります!

+0

答えをありがとう! 私のコードのためにこれを書いてくれて本当にうれしく思います! しかし、私は大量のテキストを扱う方がはるかに簡単に見えるので、私はfgetsを理解するために私の時間を取るだろうと思う。 私はこの答えに感謝しますが、私はそれのためにupvoteをプッシュ! ありがとうございました! :) – Noxter

関連する問題