このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/996
#  [1] 授業単元: c言語 
#  [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/30Mz7Pbj 
#  このプログラムで何番目の値段をかえるではなく 
#  名前を聞かれてその名前の値段をかえるプログラムにする。 
#  
#  #include
#  #include
#  main()
#  {
#  	struct goods{
#  		char name[20];
#  		char price[5];
#  	}record;
#  	FILE *fp;
#  	int max,size,num;
#  	long top,end,locat,ftell();
#  	fp=fopen("file1","r+");
#  	if(fp==NULL){
#  		printf("open error");
#  		exit(1);
#  	}
#  	size=sizeof(record);
#  	fseek(fp,0L,2);
#  	end=ftell(fp);
#  	fseek(fp,0L,0);
#  	top=ftell(fp);
#  	max=(end-top)/size;
#  	do{
#  		printf("rec no?\n");
#  		scanf("%d",&num);
#  	}while(num<1||num>max);
#  	locat=size*(num-1);
#  	fseek(fp,locat,0);
#  	fread(&record,size,1,fp);
#  	printf("name=%s price=%s\n"
#  			,record.name,record.price);
#  	printf("Current price\t:%s\n",record.price);
#  	printf("New price?\t:");
#  	scanf("%s",record.price);
#  	fseek(fp,-size,1);
#  	fwrite(&record,size,1,fp);
#  	fclose(fp);
#  	printf("update....ended\n");
#  }

'ファイル内の名前を鍵に指定して値段をかえる'(_ファイル名,_更新対象氏名,_値段) :-
        更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名),
        値段の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた値段),
        open(_ファイル名,update,InOuttream),
        '名前を指定して値段をかえる'(InOutstream,_末尾に空白を埋めた対象氏名,_末尾に空白を埋めた値段),
        close(InOututstream).

更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名) :-
        length(L,20),
        atom_chars(_更新対象氏名,Chars),
        append(Chars,L2,L),
        all(L2,' '),
        atom_chars(_末尾に空白を埋めた更新対象氏名,L).

値段の末尾に空白を埋める(_値段,_末尾に空白を埋めた値段) :-
        length(L,5),
        number_chars(_値段,Chars),
        append(Chars,L2,L),
        all(L2,' '),
        atom_chars(_末尾に空白を埋めた値段,L).        

'名前を指定して値段をかえる'(InOutstream,_,_) :-
        at_end_of_stream(InOutstream),!.
'名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段) :-
        氏名を読み更新する(InOutstream,_更新対象氏名,_値段),
        価格を更新する(InOutstream),
        '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段).

氏名を読み更新する(InOutstream,_更新対象氏名,_値段) :-
        findall(_文字,(
                    between(1,20,N),
                    get_char(InOutstream,_文字)),
                L),
        更新対象氏名の時は価格も更新する(InOutstream,_更新対象氏名,_値段).

更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :-
        atom_chars(_更新対象氏名,L),
        writef(InOutstream,'%t',[_更新対象氏名]),
        価格を更新する(InOutstream,_値段).
更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :-
        \+(atom_chars(_更新対象氏名,L)),
        価格をそのまま書く(InOutstream).

価格を更新する(InOutstream,_値段) :-
        writef(InOutstream,'%t',[_値段]).

all([],_).
all([A|R],A) :-
        all(R,A).