プロが教える店舗&オフィスのセキュリティ対策術

C言語初~中級者です。

標記のことがしたくて、下記のプログラムを作成しました。
(ソースコードを本文中に貼り付けると文字数が大幅にオーバーしますので、次のウェブページをご参照ください。)

http://www.fan.hi-ho.ne.jp/k41b9s/~student0316/a …

プログラムの概要は、最初に加算か減算かを選ばせて、適当な加減算を画面表示したあと、ファイル出力するかどうかを選ばせる表示が現れます。ファイル出力する方を選ぶと、現在日付時刻からファイル名を自動で生成してファイル出力します。その次に、無限ループによって、処理を続けるかどうかを選ばせる表示が現れます。処理を続ける方を選ぶと、また適当な加減算を画面表示し、最初と同様にファイル出力するかどうかを選ばせる表示が現れます。

ここでやりたいことがあり、一度作成したファイルが存在すれば、もう一つ新規なファイルを作るのではなく存在しているファイルに追記させたいのです。

それを実現する方法として、

fshowResultAdd()関数…加算の結果をファイル出力する。
fshowResultSub()関数…減算の結果をファイル出力する。

という関数でその機能を考えました。これらの2つの関数は、現在日付時刻からファイル名を生成する関数makeFileName()を使用します。

fshowResultAdd()関数またはfshowResultSub()関数において、引数に新旧のファイル名(pFileNameとpOldFileName)を表すchar *型のポインタを用い、

・pFileNameとpOldFileNameが等しければ、pOldFileNameにファイル出力する。
・pFileNameとpOldFileNameが異なれば、
 makeFileName(pFileName);という処理によって、
 新規にファイル名を生成してポインタpFileNameに格納し、
 そのpFileNameのファイルを開いて、pOldFileName = pFileName;によって
 pOldFileNameを更新し、pFileNameの方のファイルに出力する。

という事を行わせました。

関数呼び出し側のmain()の中では、まず

char aFileName[100] = {1,}; // a:array(配列)
char aOldFileName[100] = {0}; // aFileName[]とaOldFileName[]は
// 異なる内容となるように初期化する
char *pFileName, *pOldFileName; // p:pointer(ポインタ)
pFileName = aFileName; // ポインタの初期化
pOldFileName = aOldFileName; // ポインタの初期化

として宣言および初期化をおこない、pFileNameとpOldFileNameの初期値は異なるようにしました。その後、ファイル出力する方を選ぶと、fshowResultAdd()関数またはfshowResultSub()関数が実行され、引数pFileName、pOldFileNameの受け渡しによって、以前に出力されたファイルが存在するかどうかを判定させようとしました。

ところが実行してみると、「1回の計算に対して1つのファイルを出力する」という結果になってしまいました。すなわち、各出力ファイルの中身はどれも1行のみで、繰り返し計算を行うと、計算の回数だけファイルができる、という結果です。

そこで考えたのが、2つの引数pOldFileNameとpFileNameはポインタなので、関数の呼び出し側でも関数内部でも内容は保持されると期待したのですが、上の私のやり方では、関数の内と外では値が保持されないのかな、と思って、関数の宣言時に、引数pOldFileNameとpFileNameに"static"を付けてみました。すると、コンパイル時に、

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
D:\test>cl addsub.c
Microsoft(R) C/C++ Optimizing Compiler Version 17.00.60610.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

(中略)

指定されたストレージ クラスは、このコンテキストでは使えません。

(中略)
Microsoft (R) Incremental Linker Version 11.00.60610.1
Copyright (C) Microsoft Corporation. All rights reserved.

/out:addsub.exe
addsub.obj
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

という警告が出ました(でも、コンパイル・リンクは実行されました)。しかし、実行してみると、結果は同じでした。
(1計算ごとに1ファイルが生成し、各ファイルの中身は1行だけ。)

以上、長々と申しましたが、やりたいことは、

・一度作成したファイルが存在するかどうかを判定し、存在すればそこに追記していきたい。

ということです。

お詳しい方、ご教授頂きたく、お願い致します。

A 回答 (1件)

すみませんが要点がよくわからず以下の点だけについて書きます。

(^^;

> ・一度作成したファイルが存在するかどうかを判定し、存在すればそこに追記していきたい。

ファイル名を自動生成し、「追加書き込み」モードでオープンして使用する。
同じ名前のファイルが有れば追加での書き込みになりますし、無ければ新規でのファイル作成となります。

参考まで。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

済みません、自力で解決しました。

strcpy(pOldFileName, pFileName);
とすべきところを、
pOldFileName = pFileName;
としたことによるトラブルでした。
お蔭様で、意図通りに動きました。お騒がせして済みませんでした。

お礼日時:2021/04/22 13:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!