dポイントプレゼントキャンペーン実施中!

ファイル操作について教えてほしいのですが、
例えば、(極端な話ですが)

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


------------------------------------
というように計算しようとしています
お願いします。

A 回答 (3件)

まぁ書かれている仕様だけならこんな(↓)ところでしょうね



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#defineACTOR_SIZE100

#definetrue1
#definefalse0

#defineFILE_NAME"foo.txt"

typedefstruct _Actor {
charname;
intcnt;
} Actor;

intRegNo( char name, Actor actor[] ) {

inti;

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;
}

intmain() {

Actoractor[ACTOR_SIZE];
charname;
intindex1, 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の人は飴玉が貰えるのか(そもそもこれが成り立たないとプログラムは開始できませんが…)
・名前の長さは良いとしても登場人物の人数制限は?

さらに書けば「ファイル操作について教えて欲しい」とありますが、ファイル操作の何が判らないのですか?

この回答への補足

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

補足日時:2005/12/15 01:12
    • good
    • 0

例えば、


カウントに関するファイルを
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);
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/12/16 17:41

がると申します。


まずいくつか質問なのですが。

1.
「Aさんの飴玉」についてはあげたらインクリメント、お返しをもらったらデクリメントといった感じで数値管理をしているようなのですが、Bさんに対しては同様の処理をしないのでしょうか?

2.
登場人物は常に二人でしょうか? それとも三人以上になることを考慮したコーディングが必要なのでしょうか?

3.
プログラムが無限ループのように回って、入力待ちで処理を続けるのでしょうか?(これだと、一時的なデータをすべてメモリ上に展開しておけます)
それとも、一回一回プログラムが終了して、常にファイルに書き出す必要があるのでしょうか?

4.
最終的な結果ファイルのほかに、一時的なデータを保存するファイルなどを作成することは可能なのでしょうか?

このあたりで結構つくりが変わってくるかと思います。

この回答への補足

早速のご返答ありがとうございます。
1つ目の質問は処理はしないです。でもBさんがお返しではなく誰かに飴玉をあげた場合、Bさんもインクリメントになります。ここで肝心なのはあげた人にインクリメントを行なうことと考えています。

2つ目は登場人物は多数になります。プログラム中で登場人物をどんどん取得していくことになります。

3つ目は無限ループでどんどん登場人物を取得していきます。

4つ目は可能です。

という感じなんですがよろしくお願いします。

補足日時:2005/12/14 21:16
    • good
    • 0

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