• ベストアンサー

C言語でのファイル操作について(初心者)

ファイル操作について教えてほしいのですが、 例えば、(極端な話ですが) AさんがBさんに飴玉をあげたのが分かったら ファイルにAさんとBさんの組を登録し、 Aさんのカウンタを1つ増やす。 そしてBさんがAさんにお返しに飴玉をあげたら Aさんのカウンタを1つ減らす。 お返しをしなかったらAさんのカウンタは1のまま というようなプログラムを作成したいんですが どうやったらいいのかわかりません。誰か分かる人が いらっしゃいましたらご教授お願いします。 if(AさんがBさんに飴玉をあげたのが分かったら) { FILE *fp; fp = fopen("filename", "a"); fprintf(fp, "A"); /* filenameというファイルにAとBの組を登録*/ fprintf(fp, " B\n"); ---filenameの中--------------------- あげた人:A もらった人:B A=1 ------------------------------------ というように計算しようとしています お願いします。

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

  • ベストアンサー
回答No.2

まぁ書かれている仕様だけならこんな(↓)ところでしょうね #include <stdio.h> #include <stdlib.h> #include <string.h> #define ACTOR_SIZE 100 #define true 1 #define false 0 #define FILE_NAME "foo.txt" typedef struct _Actor { char name; int cnt; } Actor; int RegNo( char name, Actor actor[] ) { int i; for ( i = 0; i < ACTOR_SIZE; i++ ) { if ( actor[i].name == 0 ) break; if ( actor[i].name == name ) return i; } if ( i == ACTOR_SIZE ) exit( 0 ); actor[i].name = name; actor[i].cnt = 0; return i; } int main() { Actor actor[ACTOR_SIZE]; char name; int index1, index2; FILE *fp; memset( actor, 0, sizeof( actor ) ); while( true ) { printf( "あげた人:" ); name = getchar(); getchar(); index1 = RegNo( name, actor ); actor[index1].cnt++; printf( "もらった人:" ); name = getchar(); getchar(); index2 = RegNo( name, actor ); actor[index2].cnt--; fp = fopen( FILE_NAME, "a" ); if ( fp == NULL ) exit( 0 ); fprintf( fp, "あげた人:%c もらった人:%c %c=%d\n", actor[index1].name, actor[index2].name, actor[index1].name, actor[index1].cnt ); fclose( fp ); } return 0; } プログラム中の細かいエラーチェックなどは自分で付け足してください。 ただ仕様としては足りない所がまだあって、 ・同一人物間の飴玉のやり取りは成立するのか ・カウンタのディフォルト値が無いので0にしたが、カウンタが0の人は飴玉が貰えるのか(そもそもこれが成り立たないとプログラムは開始できませんが…) ・名前の長さは良いとしても登場人物の人数制限は? さらに書けば「ファイル操作について教えて欲しい」とありますが、ファイル操作の何が判らないのですか?

zunzunzunzunzun
質問者

補足

貴重な時間をありがとうございます。上記のプログラムで自分がやりたいことはなんとか出来そうです。 説明が未熟でもうしわけありません。 実際に自分が作りたいプログラムはイーサネットから送信元IPアドレスと送信先IPアドレスを取得し、送信元、送信先IPアドレスを登録、そして送信先IPアドレスのカウンタを1つ増やす所まではいいんですが、そのあと、送信先IPアドレスから送信元IPアドレスを検索してそのアドレスからカウンタを1つ減らすというプログラムを作ろうと考えています。 ファイル操作について教えて欲しいと書いたのは登録した後、ファイルを読みこみ送信先IPアドレスから送信元IPアドレスを検索、そしてカウンタを1つ減らすというファイル操作の仕方が分からなかったので質問させて頂きました。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

例えば、 カウントに関するファイルを Aさんのカウントファイル:A.dat として、やりとりについては、A.log みたいな形に分離すればいちいちファイルの中を検索しないですみます 例えばカウントアップは以下のような感じ #include <stdio.h> void main(void){ FILE *fp; int count=0; if(NULL!=(fp=fopen("A.dat","r"))) { fread(&count,sizeof(int),1,fp); fclose(fp); } count++; if(NULL!=(fp=fopen("A.dat","w"))) { fwrite(&count,sizeof(int),1,fp); fclose(fp); } }

zunzunzunzunzun
質問者

お礼

回答ありがとうございます。 なるほど…そういうやり方も出来そうですね。挑戦してみます!

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 まずいくつか質問なのですが。 1. 「Aさんの飴玉」についてはあげたらインクリメント、お返しをもらったらデクリメントといった感じで数値管理をしているようなのですが、Bさんに対しては同様の処理をしないのでしょうか? 2. 登場人物は常に二人でしょうか? それとも三人以上になることを考慮したコーディングが必要なのでしょうか? 3. プログラムが無限ループのように回って、入力待ちで処理を続けるのでしょうか?(これだと、一時的なデータをすべてメモリ上に展開しておけます) それとも、一回一回プログラムが終了して、常にファイルに書き出す必要があるのでしょうか? 4. 最終的な結果ファイルのほかに、一時的なデータを保存するファイルなどを作成することは可能なのでしょうか? このあたりで結構つくりが変わってくるかと思います。

zunzunzunzunzun
質問者

補足

早速のご返答ありがとうございます。 1つ目の質問は処理はしないです。でもBさんがお返しではなく誰かに飴玉をあげた場合、Bさんもインクリメントになります。ここで肝心なのはあげた人にインクリメントを行なうことと考えています。 2つ目は登場人物は多数になります。プログラム中で登場人物をどんどん取得していくことになります。 3つ目は無限ループでどんどん登場人物を取得していきます。 4つ目は可能です。 という感じなんですがよろしくお願いします。

関連するQ&A