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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

1200閲覧

C言語:「while文中のswitch文の正常動作」の複数回実行

Common

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/05/13 11:47

編集2021/05/13 12:32

前提・実現したいこと

C言語:「while文中のswitch文の正常動作」の複数回実行

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

以下のコードにてswitch文を使用して1回目の関数呼び出しは正常に動作するのですが,2回目以降の関数呼び出しが動作できません。具体的には,「log」に1を入力し,「case1」からmenu1の関数を動作させたのち,「log」に3を入力し,「case3」からmenu3の関数を動作させると空白のみしか返ってきません。

エラーメッセージなし。

該当のソースコード

C

1int log = 0; 2 while (1) 3 { 4 printf("行いたい動作の番号を入力して下さい\n"); 5 scanf("%d", &log); 6 printf("\n"); 7 8 switch (log) 9 { 10 case 1: 11 menu1(fp); 12 break; 13 case 2: 14 menu2(fp); 15 break; 16 case 3: 17 menu3(fp); 18 break; 19 case 4: 20 exit(1); 21 break; 22 default: 23 printf("--error--\n"); 24 } 25 }

試したこと

関数の「return 0;」が問題なのかと考え,削除しましたが意味なかったです。

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

開発環境:Windows10 , Visual Studio 2019

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Common

2021/05/13 12:17

「FILE* fp」です。テキストファイルを読み込ませています。関数内容としてはファイル操作をしています。
takasima20

2021/05/13 12:20

それの open/close はどこでやってんのかな?
pepperleaf

2021/05/13 12:20

menu1() とかは何をしてるのでしょう? これを printf("case 1");に置き換えたら、普通に動きますが、、、。
Common

2021/05/13 12:23

メインの中で行っています。プログラムとしては下記の通りです。 int main() { FILE* fp; char* fname = "txt.txt"; fp = fopen(fname, "r"); if (fp == NULL) { fp = fopen(fname, "w"); if (fp == NULL) { return -1; } } printf("--MENU--\n"); printf("'1'\n"); printf("'2'\n"); printf("'3'\n"); printf("'4'\n"); int log = 0; while (1) { printf("行いたい動作の番号を入力して下さい\n"); scanf("%d", &log); printf("\n"); switch (log) { case 1: menu1(fp); break; case 2: menu2(fp); break; case 3: menu3(fp); break; case 4: exit(1); break; default: printf("--error--\n"); } } fclose(fp); return 0; }
otn

2021/05/13 12:25

「何をしたらどうなった」が圧倒的に説明不足です。
Common

2021/05/13 12:28

menu1では,読み込んだファイルの中身を全て表示させています。menu2では,読み込んだファイルの一部を変更,出力しています。menu3では,読み込んだファイルの中身を集計をしています。 最初に「1」を入力し,全表示させた後「3」を入力し,集計させると空白のみが返ってきます。
takasima20

2021/05/13 12:29

switch 全体をコメントアウトして、例えば menu1 を2回呼んだらどうなる?
takasima20

2021/05/13 12:35

まあ、予想通りでしたね。お疲れさまでした。
Common

2021/05/13 12:36 編集

menu1を2回呼ぶと1回目のみが動作し2回目は動作しませんでした。ありがとうございます。
guest

回答2

0

ベストアンサー

ファイルを一度最後まで読んでしまったら、次に読んでもすでに最後なのは当然でしょう。

オープンし直すか、rewindするか。

投稿2021/05/13 12:31

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Common

2021/05/13 12:34

回答ありがとうございます。rewindを追加したところ正常に動作しました。ありがとうございました。
guest

0

case 4 の、exit()という関数は、プログラム終了する関数ですよ

投稿2021/05/13 11:49

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Common

2021/05/13 12:08 編集

回答ありがとうございます。説明不足でした。申し訳ないです。「case4」はプログラムの終了を目的としている為,exit()にしてあります。「case1」→「case3」と入力すると空白のみとなってしまうため,質問させていただきました。ご教授いただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問