buffer, buffer2での文字が一致した際にメモに保存した文章を表示したい。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nori

buffer, buffer2での文字が一致した際にメモに保存した文章を表示したい。

#1

投稿記事 by nori » 5日前

例えば「覚えて」と入力した後に、「映画は面白い」と入力します。
その後も「覚えて」を繰り返し、違うコメントを増やしていきます。
その後で、buffer2に読み込んだメモの文章から「映画」と含まれた文章を画面に表示したいです。

しかし、この表示したい部分がうまく解決できずにいます。

コード:

 // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合
                    if (strcmp(buffer, buffer2)==1) {
                        hyouzi = 1;
                    }
の部分に関して、
実際に「覚えて」を繰り返し、違うコメントを増やしてから、「映画」と打ち込んでエンターキーを押すと、

コード:

if (p != NULL or hyouzi == 1) {
            DrawFormatString(100, 500, GetColor(5, 105, 19), " buffer2は%s", buffer2);
           
の部分により「映画」と含んだ文章が描画されると思うのですが、実際はメモの最後の行の「映画」と含まれていない文章が表示されます。デバッグで中身を確認しようとしたのですが、実行ファイルに文字を入力してエンターキーを押した瞬間にウィンドウが消えてしまうため中身の状況が確認できず、描画関数を使い値や文字の状態を把握する手段をとっています。

どうか今回の問題を解決するためのデバッグの方法と何が原因なのか教えて頂けないでしょうか。

コード:

#pragma warning(disable: 4996)
#include "DxLib.h"
#include <string>


char String[256];
int InputHandle;
int InputHandleA;
int modoru = 0;
int mozicount = 0;
int gimonnlock = 0;
int gimon = 0;

int my_str2(const char* s1, const char* s2)//ここで入力した文字列と用意された文字列を引数として扱う。

{
    //s1, s2を比較する関数を使うためだけにs2の文字列のサイズが必要なので、変数aに用意した文字列の情報s2を文字列の長さを測るための関数strlenに引数として渡す。
    const size_t a = strlen(s2);
    //無限ループする。
    for (;;) {
        //関数memcmpの返り値が0の時は一致した時なので、==0とする。
        if (memcmp(s1, s2, a) == 0)

            return 1;//入力した文字列にい指定された文字列が入っていた場合は1を返すように設定した。
//入力した文字列が最後の文字まで到達した場合は一致する文字列がないということなので0を返すようにした。
        else if (*s1 == '\0')

            return 0;//入っていなかった
//文字列が一致した場合でも一致する文字列がない場合でも入力した文字列の一文字分の文字コードのバイト数?が繰り上がるようにした。
        else

            ++s1;

    }

}

int rireki = 0;
int rireki2 = 0;
int   LEFTmark = 0;
const char* str[100] = {
    "はい!","はい!大好きです!!あなたはどんな映画が好きですか? " ,"そうですね、、、私は恋愛映画が好きです!",
"人間観察が好きだからかもしれません。","申し訳ありません。わかりません。" ,"おはようございます。今日は何をなさるんですか?"
,"そうですか。体を動かしたり外に出てみてはいかがですか?" ,"無理しないで、少し横になりましょう。" ,"大丈夫ですか?無理をしすぎでは?"
,"どうかゆっくり休んでください","何かあればいつでも呼んでください。","何を覚えますか?" };//ここで文字を直接書いてるので、この文字のバイト数が各posmozi[]に入るだけ
int frame[100] = { 10,10 ,10,10,10,10,10,10,10 ,10,10 ,10};//次の一文字が出るまでのカウンタとして働いている、ここの数値を変えることで文字が一文字ずつ出るまでの間隔を設定できる。
int posmozi[100];//文字のバイト数が入る箱を表している。
int countS[100];//次の文字が出るまでのカウントするためのもの
int z;//関数drawString外でも使えるように外にも定義を書いた。zの数値は関係なく、文字列が入った数列がif文により同じ変数zの時にframe[z]と同じになるまで+1されていったり、+2バイトor+1バイトされていくため、
//文字が一文字ずつ入っていく、なんでzの変数に値を入れて動かす必要がないのだ。ちなみにfor (z = 0; z < 3; ++z)で書いてしまうとキーAを押した際のif文に関係なく関数drawStringの最初のzどこかに値が入っただけで繰り返しを開始してしまうため、今回のように同じ変数zの時にフレームを利用して描画するようにした。
char c = str[z][posmozi[z]];//関数drawString外でも使えるように外にも定義を書いた。


void drawString(int z, int x, int y, int color)
{
    c = str[z][posmozi[z]];//posmozi[z]
    if (countS[z] == 0 && c != '\0')
        posmozi[z] += IsDBCSLeadByte(c) ? 2 : 1;
    if (++countS[z] == frame[z]) countS[z] = 0;
    DrawFormatString(x, y, color, "%.*s", posmozi[z], str[z]);
    DrawFormatString(300, 300, (0, 0, 255), "countS[0]は%d", countS[0]);
}
int memory = 0;
int  Skey = 0;
const int PAD_DOWN = 0;

char buffer[256];//★InputHandleに入ったのは文字のデータなので、文字のデータが受け取れる変数の型にする。
char buffer2[256];
char* p;
FILE* outputfile;         // 出力ストリーム
int hyouzi = 0;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{


    SetGraphMode(1500, 780, 32);         // ウィンドウの大きさを指定
    ChangeWindowMode(TRUE);             // 全画面ではなくウインドウを使用
    // DXライブラリの初期化
    if (DxLib_Init() == -1) return -1;
    SetFontSize(42);                             //サイズを42に変更
    // 描画先を裏にする
    SetDrawScreen(DX_SCREEN_BACK);

    // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
    //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。

    InputHandle = MakeKeyInput(150, FALSE, FALSE, FALSE); //これで総計150バイトの文字データを保持できる。

    // 作成したキー入力ハンドルをアクティブにする
    SetActiveKeyInput(InputHandle);

    // キー入力終了待ちループ
    // (ProcessMessageをループごとに行う)

    while (ProcessMessage() == 0)
    {
        // 画面の初期化
        ClearDrawScreen();


        //まずは描画する部分から作る。
        // 入力モードを描画
        DrawKeyInputModeString(640, 480);
        // 入力途中の文字列を描画
        DrawKeyInputString(0, 0, InputHandle);//InputHandleはint型とリファレンスに書いてあったんで


        //その後にif文での分岐を考える。
          // 入力が終了している場合は終了
          //ループ内とは言えエンターキー一回でCheckKeyInputが呼べればいい。
         //エンターキーが押された時の部分。
        if (CheckKeyInput(InputHandle) != 0) {
            LEFTmark = 678;
            hyouzi = 0;
            gimon = 0;
            ++mozicount;
            // 入力された文字列を取得、その文字列を数値に変換
            GetKeyInputString(buffer, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードに変換したものを上でchar型で定義したbufferに入れる。
           
            if (my_str2(buffer, "覚えて")) {
                // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
   //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
                z = 11;
                // 入力された文字列を取得、その文字列を数値に変換
           //     GetKeyInputString(buffer2, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードとして、文字として表示するたの数値に変換したものを上でchar型で定義したbufferに入れる。
                ++mozicount;
                memory = 1;
                gimon = 0;
            }
            //覚えてという言葉以外の場合はメモを読み込む込んでループに入るようにした。
            else if(memory == 0){
                outputfile = fopen("da.txt", "r");  // ファイルを読み込み用にオープン(開く)
                if (outputfile == NULL) {          // オープンに失敗した場合
                    printf("cannot open\n");         // エラーメッセージを出して
                    exit(1);                         // 異常終了
                }
                //fgetsがNULLになるまで繰り返す
         //fgets(str,256,lf)!=NULL
         //と同じです。このように短縮することも可能
                //★bufferには文字入力の文字列を入れたので、ここにはメモからの文字列は入れられない。なので新しくbuffer2を作る。
                while ((p = fgets(buffer2, 256, outputfile)) != NULL)//メモに書いた文字列をbuffer2の中に入れる。

                {


                    if (my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "どんな") && my_str2(buffer, "?") ||
                        my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "?")) {
                        //  message = "どんな映画が好きなんですか?";
                       // DrawFormatString(100, 300, GetColor(255, 255, 0), "%s", buffer);

                        ++mozicount;
                        gimonnlock = 1;
                        if (my_str2(buffer2, "映画")) {
                            LEFTmark = 893;
                            if (((strstr(buffer2, buffer))) != NULL) { //映画という言葉に反応はしているが、その後のメモの文章を特定の文章を描画する部分がない。
                                LEFTmark = 893893;
                                z = 5;
                            }

                        }
                    }

                    //★ここにこいつを書くとおはようと書かれなかった場合にz=4ということになってしまう。
                    //else {
                    //    z = 4;
                    //    ++mozicount;
                    //}

                

                    /* 配列の要素を出力 */

                        //inputに入った文字のデータを数値化するために input.c_str()を定義して、下のif文に使った。

                    //変数inputに入る前はchar型のbufferに文字列が入るので、my_str2はchar*型を引数にとるため、char*型は文字列を定義するので、
                    //関数my_str2にはそのまま文字列が使えるので、その文字列が入っているbufferを直接書いた。



                    // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合
                    if (strcmp(buffer, buffer2)==1) {
                        hyouzi = 1;
                    }
                  
                     // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致しない文字が出てきた場合
                    if (hyouzi == 0) {
                        if (strcmp(buffer, buffer2) != NULL) {
                            gimon = 1;
                        }
                    }


                }
               
                fclose(outputfile);          // ファイルをクローズ(閉じる)

            }
            //できればエンターキーを押して、次の文章を記憶できるようにしたかったが、文章には必ずと言っていいほど「は」や「とは」
            //が入るし、定義のように覚えさせたいので「覚えて」の後に下のような条件で文章を記憶するようにさせた。
            if (memory == 1 && my_str2(buffer, "とは")or memory == 1 && my_str2(buffer, "は")or memory == 1 && my_str2(buffer, "が")) {
                // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
   //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。
               
                // 入力された文字列を取得、その文字列を数値に変換
           //     GetKeyInputString(buffer2, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードとして、文字として表示するたの数値に変換したものを上でchar型で定義したbufferに入れる。
                ++mozicount;
                memory = 2;
        
            }
            //duration = 1;
            // 再度インプットハンドルをアクティブにする
            SetActiveKeyInput(InputHandle);
            // 入力文字列を初期化する
            SetKeyInputString("", InputHandle);
            //++mozicount;

        }

        //エンターキーが押されていないときでの処理
        if (memory == 2) {
            LEFTmark = 100;
            //例えば、intとして49はそのままの値だが、charとしては49は文字コードで言う1を表す。//このような変換をしたようなもの。
          

            outputfile = fopen("da.txt", "w+");  // ファイルを書き込み用にオープン(開く)
            if (outputfile == NULL) {          // オープンに失敗した場合
                printf("cannot open\n");         // エラーメッセージを出して
                exit(1);                         // 異常終了
            }

            fprintf(outputfile, "%s\n", buffer); // ファイルに書く

            fclose(outputfile);          // ファイルをクローズ(閉じる)

            //fclose(fp);//ファイルに書き込んだときにウィンドウが消えるようになっているので、memoryが1になった瞬間に書き込んでいるうんぬん以前に
            //ファイルが閉じるのでウィンドウが消えてしまう。
            memory = 0;
            // return 0;//ここで0になると終了してしまうので書き込んだ後も言葉が打ち込めるようにここを消す。

        }
        //if (CheckKeyInput(InputHandle) == 0) {
        //    z = 6;
        //    ++mozicount;
       // }

        //  DrawFormatString(100, 150, GetColor(255, 255, 0), "ProcessMessage()は%d,modoruは%d", ProcessMessage(), modoru);
        DrawFormatString(0, 150, GetColor(255, 255, 0), "mozicountは%d,zは%d", mozicount,z);
        DrawFormatString(0, 250, GetColor(255, 255, 0), " LEFTmarkは%d",LEFTmark);
        DrawFormatString(100, 100, GetColor(255, 255, 0), " gimonnlockは%d,memoryは%d, Skeyは%d", gimonnlock, memory, Skey);
        DrawFormatString(100, 300, GetColor(255, 255, 0), "bufferは%s", buffer);
        DrawFormatString(100, 400, GetColor(5, 105, 0), "gimonは%d,hyouziは%d", gimon, hyouzi);


        //新しい言葉の処理

            //文字カウントが1の時
        if (mozicount > 0) {
            drawString(z, 10, 100, GetColor(5, 255, 255));

        }

        if (p != NULL or hyouzi == 1) {
            DrawFormatString(100, 500, GetColor(5, 105, 19), " buffer2は%s", buffer2);
           
        }
        if (hyouzi == 0 && gimon == 1) {

            DrawFormatString(100, 600, GetColor(5, 105, 0), "申し訳ありません%sとは何ですか?", buffer);
        }

        // 裏画面の内容を表画面に反映させる
        ScreenFlip();





    }

    // 用済みのインプットハンドルを削除する
    DeleteKeyInput(InputHandle);

    // 画面の初期化
    ClearDrawScreen();

    // 裏画面の内容を表画面に反映させる
    ScreenFlip();

    // キー入力待ち
   // WaitKey();

    //ループないやループから出た後で何かしらの問題が発生したら終了する。
    // DXライブラリの使用終了
    DxLib_End();

    // 終了
    return 0;
}

アバター
usao
記事: 1584
登録日時: 7年前

Re: buffer, buffer2での文字が一致した際にメモに保存した文章を表示したい。

#2

投稿記事 by usao » 5日前

所構わずマルチポストし続けるその精神力に敬意を表して
コードに関しては1つだけ指摘しておきやしょう.

あなたが行うべき比較というのは
strcmp(buffer, buffer2)==1
で達成できるものなのか?ってところですぜ.
strcmpでググればこの関数が行うことの意味がわかりやすし
この関数の戻り値と1とを比較するという処理の妥当性の無さをも知ることもできると思いやすぜ.


そしてさらに生きるヒントを差し上げるならば

(1)こういう場では【コードの長さ】というのはそれだけで負の雰囲気を醸し出すんで.
読み手には「そんなクソ長い未知のコードなんか読みたくない→関わらない」という心理が働くもんです.
そのコード表示エリアのスクロールバーのサイズ見ただけでもうほとんどの人は「無理」なんですぜ.
(2)話がごちゃごちゃと整理されてないのもその時点で「わざわざ関わりたくない」と思われる率が高いですぜ.
わざわざ無料で「そもそも何の話?」ってところの整理から取り組んでくれる人なんて相当の暇人ですぜ.
(3)マルチポストという行為はそれだけでもう大変に嫌われるってのがこれ系の場所の文化ってもんですぜ.人によってはそれだけでヘイトMAXですぜ.

つまるところ
話に関わってもらうにも相応の工夫が必要だと思うのでございますぜ.

アバター
usao
記事: 1584
登録日時: 7年前

Re: buffer, buffer2での文字が一致した際にメモに保存した文章を表示したい。

#3

投稿記事 by usao » 5日前

とりあえずやりてぇことの中身だけを直にやるようにすりゃあ
もうちょいマシな形になるんじゃあありませんかね?

「映画」で検索かけて表示するって話にはDXライブラリなんて必要ねぇんじゃあないですかい?
特定のライブラリに依存しているコードってのもそれだけで回答者が減る要因かと思いますぜあっしは.
そいつをとりあえず除去するだけでもウィンドウが閉じちまうとかいう謎の問題は消え失せるんじゃねぇかと思いやすし
コードも相応に短くなるでしょうし良いことづくめなんじゃありやせんか?

なんてことはもう他所でもさんざん言われているかもしれやせんが
そういうのは場所変えたところで反応が変わるもんでもないんじゃねぇかと.

Ouxiy
記事: 173
登録日時: 11ヶ月前

Re: buffer, buffer2での文字が一致した際にメモに保存した文章を表示したい。

#4

投稿記事 by Ouxiy » 5日前

usaoさん、返信ありがとうございます。
そうですね、確かにDXライブラリを使う意味はないかもしれないですが、DXライブラリさんのような文字?でウィンドウに文字を描画するようにできたらいいなあと思っていましたが、依存した環境により解答者様が減るならば使うのは断念したほうがいいかもしれません。
貴重なご意見どうもありがとうございます。

アバター
usao
記事: 1584
登録日時: 7年前

Re: buffer, buffer2での文字が一致した際にメモに保存した文章を表示したい。

#5

投稿記事 by usao » 5日前

少なくとも機能のロジックの動作を見る分にはprintfでも何でも良いんじゃありやせんかね.
あっしはそう思いますぜ.
「結果が異常」という問題だけにフォーカスするならば入力部分すらも不要でありやしょう.

#質問時と応答時とで名前が違う点にはもう今さらどうこう言いませんぜ.

Ouxiy
記事: 173
登録日時: 11ヶ月前

Re: buffer, buffer2での文字が一致した際にメモに保存した文章を表示したい。

#6

投稿記事 by Ouxiy » 5日前

早速、DXライブラリに依存しないコードの方に変更しました。
ですが、問題が発生しました。

まずは「覚えて」という言葉を入力した場合に、buffer2に覚えさせたい文字列を入力するのですが、
入力しようとするとウィンドウが閉じます。デバッグしてみるとファイルが開けないというエラーができるのですが、同じフォルダにはtest.txtは入っているのでファイルが開けられない原因がわかりません。

環境はWindows10、Visual studio 2019でreleaseでx64です。

コード:

#pragma warning(disable: 4996)
#include <string>
#include <Windows.h>


char String[256];
int InputHandle;
int InputHandleA;
int modoru = 0;
int mozicount = 0;
int gimonnlock = 0;
int gimon = 0;

int my_str2(const char* s1, const char* s2)//ここで入力した文字列と用意された文字列を引数として扱う。

{
    //s1, s2を比較する関数を使うためだけにs2の文字列のサイズが必要なので、変数aに用意した文字列の情報s2を文字列の長さを測るための関数strlenに引数として渡す。
    const size_t a = strlen(s2);
    //無限ループする。
    for (;;) {
        //関数memcmpの返り値が0の時は一致した時なので、==0とする。
        if (memcmp(s1, s2, a) == 0)

            return 1;//入力した文字列にい指定された文字列が入っていた場合は1を返すように設定した。
//入力した文字列が最後の文字まで到達した場合は一致する文字列がないということなので0を返すようにした。
        else if (*s1 == '\0')

            return 0;//入っていなかった
//文字列が一致した場合でも一致する文字列がない場合でも入力した文字列の一文字分の文字コードのバイト数?が繰り上がるようにした。
        else

            ++s1;

    }

}

int   LEFTmark = 0;
const char* str[100] = {
    "はい!","はい!大好きです!!あなたはどんな映画が好きですか? " ,"そうですね、、、私は恋愛映画が好きです!",
"人間観察が好きだからかもしれません。","申し訳ありません。わかりません。" ,"おはようございます。今日は何をなさるんですか?"
,"そうですか。体を動かしたり外に出てみてはいかがですか?" ,"無理しないで、少し横になりましょう。" ,"大丈夫ですか?無理をしすぎでは?"
,"どうかゆっくり休んでください","何かあればいつでも呼んでください。","何を覚えますか?" };//ここで文字を直接書いてるので、この文字のバイト数が各posmozi[]に入るだけ
int frame[100] = { 10,10 ,10,10,10,10,10,10,10 ,10,10 ,10 };//次の一文字が出るまでのカウンタとして働いている、ここの数値を変えることで文字が一文字ずつ出るまでの間隔を設定できる。
int posmozi[100];//文字のバイト数が入る箱を表している。
int countS[100];//次の文字が出るまでのカウントするためのもの
int z;//関数drawString外でも使えるように外にも定義を書いた。zの数値は関係なく、文字列が入った数列がif文により同じ変数zの時にframe[z]と同じになるまで+1されていったり、+2バイトor+1バイトされていくため、
//文字が一文字ずつ入っていく、なんでzの変数に値を入れて動かす必要がないのだ。ちなみにfor (z = 0; z < 3; ++z)で書いてしまうとキーAを押した際のif文に関係なく関数drawStringの最初のzどこかに値が入っただけで繰り返しを開始してしまうため、今回のように同じ変数zの時にフレームを利用して描画するようにした。
char c = str[z][posmozi[z]];//関数drawString外でも使えるように外にも定義を書いた。


void drawString(int z, int x, int y, int color)
{
    c = str[z][posmozi[z]];//posmozi[z]
    if (countS[z] == 0 && c != '\0')
        posmozi[z] += IsDBCSLeadByte(c) ? 2 : 1;
    if (++countS[z] == frame[z]) countS[z] = 0;
   // DrawFormatString(x, y, color, "%.*s", posmozi[z], str[z]);
   // DrawFormatString(300, 300, (0, 0, 255), "countS[0]は%d", countS[0]);
}
int memory = 0;
int  Skey = 0;
const int PAD_DOWN = 0;

char buffer[256];//★InputHandleに入ったのは文字のデータなので、文字のデータが受け取れる変数の型にする。
char buffer2[256];
char* p;
FILE* outputfile;         // 出力ストリーム
int inputmozi = 0;
int hyouzi = 0;
unsigned char uchr;
int main(void)
{


    while (1)
    {
        //	キーボード入力待ち
        inputmozi = getchar();
        sprintf(buffer, "%d", inputmozi);
        if (my_str2(buffer, "覚えて")) {
           
            z = 11;
           ++mozicount;
            memory = 1;
            gimon = 0;
        }
        //覚えてという言葉以外の場合はメモを読み込む込んでループに入るようにした。
        else if (memory == 0) {
            outputfile = fopen("da.txt", "r");  // ファイルを読み込み用にオープン(開く)
            if (outputfile == NULL) {          // オープンに失敗した場合
                printf("cannot open\n");         // エラーメッセージを出して
                exit(1);                         // 異常終了
            }
            //fgetsがNULLになるまで繰り返す
     //fgets(str,256,lf)!=NULL
     //と同じです。このように短縮することも可能
            //★bufferには文字入力の文字列を入れたので、ここにはメモからの文字列は入れられない。なので新しくbuffer2を作る。
            while ((p = fgets(buffer2, 256, outputfile)) != NULL)//メモに書いた文字列をbuffer2の中に入れる。

            {


                if (my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "どんな") && my_str2(buffer, "?") ||
                    my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "?")) {
                    //  message = "どんな映画が好きなんですか?";
                   // DrawFormatString(100, 300, GetColor(255, 255, 0), "%s", buffer);

                    ++mozicount;
                    gimonnlock = 1;
                    if (my_str2(buffer2, "映画") && my_str2(buffer, "どんな")) {
                        LEFTmark = 893;
                        hyouzi = 1;

                    }
                }

                /* 配列の要素を出力 */

                    //inputに入った文字のデータを数値化するために input.c_str()を定義して、下のif文に使った。

                //変数inputに入る前はchar型のbufferに文字列が入るので、my_str2はchar*型を引数にとるため、char*型は文字列を定義するので、
                //関数my_str2にはそのまま文字列が使えるので、その文字列が入っているbufferを直接書いた。



                // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合
                if (strcmp(buffer, buffer2) == 1) {
                    hyouzi = 1;
                }

                // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致しない文字が出てきた場合
                if (hyouzi == 0) {
                    if (strcmp(buffer, buffer2) != NULL) {
                        gimon = 1;
                    }
                }


            }

            fclose(outputfile);          // ファイルをクローズ(閉じる)

        }
        //できればエンターキーを押して、次の文章を記憶できるようにしたかったが、文章には必ずと言っていいほど「は」や「とは」
        //が入るし、定義のように覚えさせたいので「覚えて」の後に下のような条件で文章を記憶するようにさせた。
        if (memory == 1 && my_str2(buffer, "とは") or memory == 1 && my_str2(buffer, "は") or memory == 1 && my_str2(buffer, "が")) {
            // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)


             // 入力された文字列を取得、その文字列を数値に変換
            ++mozicount;
            memory = 2;

        }

    }
    //エンターキーが押されていないときでの処理
    if (memory == 2) {
        LEFTmark = 100;
        //例えば、intとして49はそのままの値だが、charとしては49は文字コードで言う1を表す。//このような変換をしたようなもの。


        outputfile = fopen("da.txt", "w+");  // ファイルを書き込み用にオープン(開く)
        if (outputfile == NULL) {          // オープンに失敗した場合
            printf("cannot open\n");         // エラーメッセージを出して
            exit(1);                         // 異常終了
        }

        fprintf(outputfile, "%s\n", buffer); // ファイルに書く

        fclose(outputfile);          // ファイルをクローズ(閉じる)

        //fclose(fp);//ファイルに書き込んだときにウィンドウが消えるようになっているので、memoryが1になった瞬間に書き込んでいるうんぬん以前に
        //ファイルが閉じるのでウィンドウが消えてしまう。
        memory = 0;
        // return 0;//ここで0になると終了してしまうので書き込んだ後も言葉が打ち込めるようにここを消す。

    }
  
    printf("取得した文字:%d", mozicount);

    //新しい言葉の処理


    if (p != NULL or hyouzi == 1) {
        printf("取得した文字:%c", buffer2);

    }
    if (hyouzi == 0 && gimon == 1) {
        printf("%cとは何ですか?", buffer);
    }

    // 終了
    return 0;
}


Ouxiy
記事: 173
登録日時: 11ヶ月前

Re: buffer, buffer2での文字が一致した際にメモに保存した文章を表示したい。

#7

投稿記事 by Ouxiy » 5日前

すいません。フォルダのtxt名が間違っていました。「test.txt」ではなく、「da.txt」でした。
書き直したところちゃんと開けました。

Ouxiy
記事: 173
登録日時: 11ヶ月前

Re: buffer, buffer2での文字が一致した際にメモに保存した文章を表示したい。

#8

投稿記事 by Ouxiy » 5日前

すいません。フォルダのtxt名が間違っていました。「test.txt」ではなく、「da.txt」でした。
書き直したところちゃんと開けました。
すいません、文字は打てるのですが、「覚えて」と入力した後の言葉を入力ができていないようで
テキストには何も書かれていませんでした。なのでデバッグで「覚えて」と入力してみました。
するとオープンファイルが開けませんと先ほどと同じエラーが出ます。どなたか原因の分かる方はいますでしょうか。

返信

“C言語何でも質問掲示板” へ戻る