• ベストアンサー

C言語での採番について

自動的に採番を割り振るプロブラムを作りたいです。 checknum とfor文、ファイルオープン、ファイルクローズなどを使えばできるらしいのですが、具体的にどのようなプログラムを書けばよいのでしょうか。 例)コマンドプロンプト上で、実行すると、、 「番号1が最初に付与されている画面が出てくる⇒画面を更新すると次に番号2が割り振られれて出てくる」 といった具合にしたいです。 番号:1 ⇒ 番号:2 ⇒番号:3 .....

質問者が選んだベストアンサー

  • ベストアンサー
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.4

No3 の補足に対して あくまで私が書いた手順で実装していいのであれば(他にもいろいろと考え方はあるので) の前提とあなたの書いたコードを極力生かす方向でこちらも書き込みます 全ては書かないので コンパイルちゃんと通るように他の部分も編集してください 括弧の対応と 関数・引数の型宣言などは省いています int i ;  これが採番用のグローバル変数に該当します この下に 書きわ忘れたという main() { を追加 >for(i=1;i<100;i++)  要らない >{           要らない >if((fp = fopen("test.dat", "a")) == NULL)   読み込みモードの指定が不足 >fprintf(fp, "ファイルのオープンに失敗しました.\n");    ここに採番用のグローバル変数の初期化処理追加  >eturn ;     要らない(これあったらいつまでたっても初期起動ができません) >fp=fopen("test.dat","a");    既にfpでファイル開いているので 処理変えないといけません        ・これをなくす        ・先のオープンで正常に開けたときはCloseしておく (オープンエラーだったときはここでもオープンエラーになるだけです)    どちらか好きな方を選んでください    データ読み込みのところでも触れますがファイルが無い場合でも    そのまま突き進みますのでデータ読み込み処理は 正常オープンできた時だけ行うように変更してください >f(fscanf(fp, "%d" , i )==0) > { >               /*途中で採番を終了する場合は番号に0を入力*/ >  fprintf("番号:%d", i ); >  break; >} 先の処理でファイルが無くて(オープンエラー)もここに来るので ファイル正常に開けたときにデータよ読むように組み替えた方がいい   その上でデータが読めない場合は ・採番用のグローバル変数の初期化処理追加                     ・ファイル破損によるプログラム終了 ファイル破損起こったとき次回起動をどう扱うかは                    とりあえず考慮しません   どちらかを選択してください   どちらにしてもその後で一旦設定ファイル(fp)を閉じてください > fprintf("番号:%d", i ); 最初のforループはなくしたのでここで手順3のループ処理追加 for(;;) の永久ルーブで可 そのループの中で    現在の採番用のグローバル変数表示    オペレータ入力操作待ちで入力値判断     ≠0:採番用のグローバル変数+1     =0:ルーブ脱出 >fclose(fp); 先に開いたモードは読み込みモードであり書き込みができない そしてこの段階では既に閉じているように変更しているので 改めて 書き込みモード でファイルのオープン処理追加 現在の採番用のグローバル変数の書き込み ファイルクローズ  の手順を行って プログラム終了 といった形になります(此方も作ってないので書き間違えもあるかもしれません) 後途中で気が付きましたが 現在の採番として 3 を表示している段階で終了 次回開いたときは 4  の表示にしたいのであれば     ≠0:採番用のグローバル変数+1  のところは     無条件で+1する必要があります 私は 次回開いたときも 3 から始まるのかと思ってたんで どちらにするのかで処理変えてください 後厳密に言えば細かいエラー処理入れるともっと複雑になります (基本コード構築を優先で考えているので特に触れていません)

waseuni
質問者

お礼

いろいろと細かな指導ありがとうございます。 概ね理解できました。実際にプログラミングするとなるとまた手こずりそうですが。。 もう一度アドバイスに従い、プログラミングを組み直してみます。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.3

コードは意図的に書きませんので自分で書いてください   流れだけ説明します 1.採番用のグローバル変数を用意する 2.プログラム開始によって設定ファイルを読み込み   ファイルが無い場合は採番用のグローバル変数に1をセットする   ファイルがあった場合ファイルの中身のデータを採番用のグローバル変数にセットする 3.ループ処理を行い終了アクションが行われるまで処理を行う     ここで画面を更新処理がされたら採番用のグローバル変数を+1して再度アクションを待つ (採番値が予定の上限に達した時の対処も忘れずに)     終了アクション処理が行われた場合は4に進む 4.現在の採番用のグローバル変数の値を設定ファイルに書き込んでプログラム終了する ↑のコード書けば実現できます ・設定ファイル名は自分で勝手に決めればいい  プログラムフォルダと同じフォルダに置く位の工夫はした方がいいでしょう ・ファイルの中身は採番用の値を保存するだけなのでテキスト(ASCII)形式でも  バイナリ形式でもこれまた自分の好きなようにすればいい ・どこからchecknumなんてことが出たかわかりませんがそんなものは要りません  checknum が 採番用のグローバル変数を意味してるのかもしれませんが ・最終値をいくつにするかによって変数型を決めればいい  オーバーフローする場合の対処が必要ならそれも行うこと  (上限値に達したらそれ以上行かないのか1に戻るのか 好きにしてください)     他の回答と合わせて関数として必要なのは他にRead・Write関数です あまり人を頼らないで分からないながらでも とりあえず自分で調べてコードを書いてみてください    その上でそうしても解決できないなら具体的に何が分からないのかを    質問(補足)してください それだけでも回答者に与える印象がずいぶん変わります

waseuni
質問者

お礼

main関数忘れました。。

waseuni
質問者

補足

int i ; for(i=1;i<100;i++) { FILE *fp; if((fp = fopen("test.dat", "a")) == NULL)   { fprintf(fp, "ファイルのオープンに失敗しました.\n"); return ; } fp=fopen("test.dat","a");  if(fscanf(fp, "%d" , i )==0)  {                /*途中で採番を終了する場合は番号に0を入力*/ fprintf("番号:%d", i ); break; }    fprintf("番号:%d", i ); fclose(fp); } 全くそのとおりですね。ソースを書いてみました。(koi1234さんの助言全ては書けませんでした。。) 無茶苦茶かもしれませんがこれでうまく採番できるでしょうか。

すると、全ての回答が全文表示されます。
回答No.2

> 同じdatファイルに書き込み、書き込みが終わったら画面を終了させ、再び同じ画面が現れ、同時に次の採番がなされるようにしたいと考えております。 うん。それで、なにが問題なのかな? 僕が示したサンプルでは解決のヒントにはならんということ?

waseuni
質問者

お礼

epistemeさんの回答を熟考したら、ファイルが複数でも一つでも同じようなプログラムになることがわかりました。 ありがとうございます。

waseuni
質問者

補足

とんでもないです、解決の足掛かりになりました。ありがとうございます。 先ほどの補足は、 >たとえば順に "file01.txt", "file02.txt"... のように ファイル名が作られればいいですか? ファイルは複数作るのではなく、一つのファイルに対してファイルオープン、入出力(読み書き)、ファイルクローズを繰り返し、その度に採番号を割り振りたい、という意味です。 そのようなプログラムにするためにはどうすればよいでしょうか。 意図が伝わらないとしたら私の知識不足による説明力の低さに原因があります。 すみません。

すると、全ての回答が全文表示されます。
回答No.1

質問:採番号された値をどうすればいいですか、たとえば順に "file01.txt", "file02.txt"... のように ファイル名が作られればいいですか? そうであるなら: const int N = 10; /* ひとまず 00 から 09 まで */ int i; char fname[64]; /* 64はテキトーな値 */ for ( i = 0; i < N; ++i ) { FILE* fp; sprinf(fname, "file%02d.txt", i); /* これで fname にファイル名が生成された。 この名前でファイルを作ればいい */ fp = fopen(fname,"w"); /* ここでナカミを書き込む */ fclose(fp); }

waseuni
質問者

補足

素早い回答感謝致します。 また、質問内容が抽象的になり申し訳ございません。 画面上で、番号:1が採番されているとします。 画面のどこかで0を入力してその画面を終了させます。 再び同じ画面が現れ、番号:2が画面上に現れます。 といった具合です。 同じdatファイルに書き込み、書き込みが終わったら画面を終了させ、再び同じ画面が現れ、同時に次の採番がなされるようにしたいと考えております。

すると、全ての回答が全文表示されます。

関連するQ&A