質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.07%

test.batに書いてある変数Seenの値を読み込んで変数Seenの値を変える。

受付中

回答 4

投稿 編集

  • 評価 0
  • クリップ 0
  • VIEW 145

R-ogiura

score 0

前提・実現したいこと

同じフォルダに入っているtest.batに書いてある変数の値をキースペースを押したときに読み込みたいのですがうまくいきません。あと何を付け足せばいいのでしょうか。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

if (Key[KEY_INPUT_SPACE] == 1) {
            FILE* fp;
            char filename[] = "test.bat";
            int buf_w[1], buf_r[1];
            int i;
            tai = 0;
            for (i = 0; i < 1; i++)

                buf_w[i] = (i + 1);

            if (!(fp = fopen(filename, "wb")))
                return;
            if (fwrite(buf_w, sizeof(int), 1, fp) != 1) {
                fclose(fp);
                return;
            }
            fclose(fp);

            if (!(fp = fopen(filename, "rb")))
                return;
            if (fwrite(buf_r, sizeof(int), 1, fp) != 1) {
                fclose(fp);
                return;
            }
            fclose(fp);

            Seen = buf_r[i];//batファイルの一行目に読み込んだ値を変数Seenに代入する

試したこと

debugを行うと変数iは‐1でした。0に設定したはずなのになぜでしょうか。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

編集
あの後以下のように書き直しました。

if (Key[KEY_INPUT_SPACE] == 1) {

            if (!(fp = fopen(filename, "rb")))
                return;
            if (fwrite(buf_r, sizeof(int), 1, fp) != 1) {
                fclose(fp);
                return;
            }
            fclose(fp);

            Seen = buf_r[yomikomi];
        }


test.batの中身は数値の8です。
変数iは名前をyomikomiに変えました。実行時の値はyomikomiもbuf_r[yomikomi]も0です。
また初期化のためにint  buf_r[1] = { 0 };と書きましたが「初期化されていないメモリbuf_rを使っていますと言われます。

FILE* fp;
char filename[] = "test.bat";
int  buf_r[1] = { 0 };
int yomikomi = 0;

実行ファイルを開き、スペースキーを押しましたところyomikomiもbuf_r[yomikomi]も0のままで、変数Seenも0のままです。

編集2

if (Key[KEY_INPUT_SPACE] == 1) {

            if (!(fp = fopen(filename, "rb")))
                return;
            if (fread(buf_r, sizeof(int), 1, fp) != 1) {
                fclose(fp);
                return;
            }
            fclose(fp);

            Seen = buf_r[yomikomi];
        }
    }


のように書き直し、バッチファイルの内容は

Seen = 8;


と書きました。実行してスペースキーを押すとSeenの値が変化しました。
しかし8に変化したのではなく、とんでもなく大きな数値1852138835に変化しました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    上記に当てはまらず、質問内容が明確になっていない質問には「」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

回答 4

+1

fwriteしてるからでは。
freadしないと。

投稿

ttyp03

ttyp03

score 14022

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • R-ogiura

    R-ogiura

    2019/11/06 09:50

    そうでした!
    どうもありがとうございます!

0

  if (!(fp = fopen(filename, "wb")))

これでいきなりtest.batの内容を消去してしまってます
また、どーみても、ファイルから読み込んでません。
そもそもの作りを見直しましょう

投稿

y_waiwai

y_waiwai

Git総合1位

score 28821

    • 回答の評価を上げる

      以下のような回答は評価を上げましょう

      評価が高い回答ほどページの上位に表示されます。

    • 回答の評価を下げる

      下記のような回答は推奨されていません。

      評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

    • R-ogiura

      R-ogiura

      2019/11/06 09:50 編集

      指摘、ありがとうございます!

    0

    テキストファイルをバイナリ・オープンし、ファイルの"先頭4バイト"を読んでint変数にねじこむ...が、あなたのやりたいことですか?コードはそんなことやって、そのとおりに動いています。

    投稿

    編集

    episteme

    episteme

    score 6153

    • 回答の評価を上げる

      以下のような回答は評価を上げましょう

      評価が高い回答ほどページの上位に表示されます。

    • 回答の評価を下げる

      下記のような回答は推奨されていません。

      評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

    • episteme

      episteme

      2019/11/06 16:41

      #define _CRT_SECURE_NO_WARNINGS
      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>

      int main() {
      FILE* fp;
      int Seen = 0;
      fp = fopen("test.bat","rt");
      if (fp != NULL) {
      char line[256];
      fgets(line,256,fp); // 1行をlineに読み込む
      fclose(fp);
      const char* p = strchr(line, '=');
      //'=' を見つけたら、それ以降の文字列をintに変換してSeenにセット
      if ( p != NULL ) {
      Seen = atoi(p + 1);
      }
      }
      printf("Seen = %d\n", Seen);
      return 0;
      }

      こんなことしたかったんかな?

    0

    fscanf を使えば簡単です。

    #include <stdio.h>
    
    int main(void)
    {
        FILE *fp = fopen("test.bat", "r");
        if (!fp) return 1;
        int seen;
        if (fscanf(fp, " Seen =%d", &seen) != 1) return 2;
        fclose(fp);
        printf("seen = %d\n", seen);
    }

    投稿

    kazuma-s

    kazuma-s

    score 610

    • 回答の評価を上げる

      以下のような回答は評価を上げましょう

      評価が高い回答ほどページの上位に表示されます。

    • 回答の評価を下げる

      下記のような回答は推奨されていません。

      評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

    15分調べてもわからないことは、teratailで質問しよう!

    • ただいまの回答率 90.07%
    • 質問をまとめることで、思考を整理して素早く解決
    • テンプレート機能で、簡単に質問をまとめられる