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件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
すみませんが要点がよくわからず以下の点だけについて書きます。
(^^;> ・一度作成したファイルが存在するかどうかを判定し、存在すればそこに追記していきたい。
ファイル名を自動生成し、「追加書き込み」モードでオープンして使用する。
同じ名前のファイルが有れば追加での書き込みになりますし、無ければ新規でのファイル作成となります。
参考まで。
ご回答ありがとうございます。
済みません、自力で解決しました。
strcpy(pOldFileName, pFileName);
とすべきところを、
pOldFileName = pFileName;
としたことによるトラブルでした。
お蔭様で、意図通りに動きました。お騒がせして済みませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) Excelのマクロについてご教授ください 2 2023/02/25 09:43
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) 【マクロ】エラーが発生⇒実行時エラー58既に同名のファイルが存在 5 2022/08/31 10:03
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
シェルコマンドの 2>&1 とはど...
-
テキストファイルに改行コード...
-
VC++でUTF-8のファイルを出力し...
-
コマンド(例えばls)の出力結果...
-
Acccess レポートをグループ別...
-
UNIX & Linux の標準出力で得た...
-
サウンド出力のデバイスを選択...
-
CreateProcess関数と実行後の戻...
-
AccessVBA複数レポート条件毎に...
-
カスタマバーコードの印刷
-
fortranのtxtファイル出力書式...
-
gnuplotでreplotできない??
-
stdin,stdoutについて
-
C言語でBMP画像(ファイル)は...
-
標準出力とファイルに効率的に...
-
BitBltについて。
-
Wordマクロで指定したフォルダ...
-
C言語で・・・・。
-
MATLABのCSV形式での書き込みに...
-
拡張子.vsdをイラストレーター...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド(例えばls)の出力結果...
-
Acccess レポートをグループ別...
-
VC++でUTF-8のファイルを出力し...
-
サウンド出力のデバイスを選択...
-
ファイルの文字コードをUTF-8に...
-
VBA でメモ帳へ保存する際の保...
-
ファイル出力の場所を指定
-
ファイル形式またはファイル拡...
-
テキストファイルに改行コード...
-
シェルコマンドの 2>&1 とはど...
-
Wordマクロで指定したフォルダ...
-
AccessVBA複数レポート条件毎に...
-
二次元配列をクリップボードに...
-
UNIX & Linux の標準出力で得た...
-
フォルダにあるPDF情報の抽出(VBA)
-
C++ BuilderでPDF出力
-
VBSでEXCEL⇒CSV変換で日付の書...
-
fortranのtxtファイル出力書式...
-
CBool関数について VB6とVB.net...
-
ワードからPDF変換でグラフが表...
おすすめ情報