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

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

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

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

Q&A

解決済

2回答

1542閲覧

"a"を使っているのに上書きされてしまう

papukin

総合スコア5

C

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

0グッド

0クリップ

投稿2019/10/22 03:44

前提・実現したいこと

プログラミング初心者です。現在C言語を学習しています。
正の整数を入力して、ファイルにその数値が存在しない場合、新しい行に書き加え、負の整数が入力されるまでその処理を繰り返し、2回目以降のプログラム実行でもファイル数値は保存されているようにするというプログラムを作成したいと持っています。助けていただけると幸いです。

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

ファイルに何も記載されていない状態だとうまく動いているようなのですが、2回目以降の実行時に前回入力した数値が上書きされてしまいます。

該当のソースコード

C

1 2#include <stdio.h> 3 4int main(){ 5 printf("ファイルの数値を確認し、新しい数値のみ記録する。\n"); 6 FILE *FP; 7 FP=fopen("inputLog.txt", "w"); 8 fclose(FP); 9 int num, Log, judge, count, loop, i; 10 11 12 if((FP=fopen("inputLog.txt", "r"))==NULL){ 13 return -1; 14 }else{ 15 do{ 16 count++; 17 }while(fscanf(FP, "%d", &Log)!=EOF); 18 } 19 fclose(FP); 20 21 22 do{ 23 printf("記録したい正の整数を入力してください。また、正でない整数が入力されるとプログラムを終了します。: "); 24 scanf("%d", &num); 25 FP=fopen("inputLog.txt", "r"); 26 for(loop=0;loop<count;loop++){ 27 fscanf(FP, "%d", &Log); 28 if(num==Log){ 29 printf("この数値はすでに記載されています。\n"); 30 fclose(FP); i=-1; break; 31 }else if(num<0){ 32 printf("プログラムを終了します。\n"); 33 judge=-1; fclose(FP); i=-1; break; 34 } 35 }if(i!=-1){ 36 fclose(FP); 37 FP=fopen("inputLog.txt", "a"); 38 fprintf(FP, "%d\n", num); 39 fclose(FP); 40 count++; 41 } 42 }while(judge!=-1); 43 return 0; 44} 45 46

試したこと

fopen()で"a"を使いましたが上書きされてしまいます。

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

Xcodeでプログラミングしています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

全然読んでないけどこれじゃないですか?

FP=fopen("inputLog.txt", "w");
fclose(FP);

投稿2019/10/22 03:45

編集2019/10/22 03:46
Zuishin

総合スコア28660

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

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

papukin

2019/10/22 11:05

そこの部分はファイルがない場合に新しくファイルを作成するために入れました。
Zuishin

2019/10/22 11:06

入れた理由はわかりましたが、ファイルがある状態でこれを取り除いてからテストしてみてください。これが原因なら追記されるはずです。
Y.H.

2019/10/22 11:10

>pupkin ファイルが無い場合だけでなく、ファイルが有る場合にも新しく空のファイルが作られますよ。
Zuishin

2019/10/22 11:22 編集

また、"w" をやめて "a" にしても、ファイルの無い状態でなら新しいファイルが作られます。"w" だと Y.H. さんのおっしゃる通り、既存のファイルは初期化されます。
papukin

2019/10/25 03:22

"w"を使うと毎回ファイルの中身が更新されしまうので、"a"を使う方が良いのですね。"w"を"a"に変えてみましたが、やはり1回目は上手く動作しているようですが、2回目以降に入力した数値がファイルに記録されていないようです。
Zuishin

2019/10/25 03:35 編集

他にもあるということですね。時間があったら読んでみますが、その前にどうなるのか、またどうなったら正解なのかを詳しく書いてください。
Zuishin

2019/10/25 09:23

見てみました。直接の原因は count が 0 で初期化されていないことです。また、不具合が起こる確率は低いといえば低いのですが、fana さんのおっしゃる通り i の初期化がなされていないのもよくありません。不具合が起こる時には起こります。 他にもうなるようなところはありますが、とりあえずそこを直せば動くと思います。
fana

2019/10/25 09:26

iを-1にした後,それを(-1以外に)戻す処理が無いので,以降は何を入力してもファイルに追記されない状態ですね.
Zuishin

2019/10/25 09:31

そこは見落としていました。確かに記録済みの数を一度入力するともう追記できませんね。do ループの先頭で初期化しなくてはいけません。
papukin

2019/10/25 18:51

お二人の助言通りiの値を初期化できるようにi=0;をdo,while処理の先頭に追加したところ、上手く処理ができるようになりました!ありがとうございます!
guest

0

後半の do~while ループ内における
変数 iやcountの役割を考えて,常に適切な値になるようにしてください.
(まず,初期値すら与えられていない…)

投稿2019/10/25 07:32

fana

総合スコア11656

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問