ファイルデータの更新処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taz

ファイルデータの更新処理

#1

投稿記事 by taz » 7年前

こんにちは。
ファイルデータの更新処理を作成したいのです。
今出来ているコードは以下のとおりです。

コード:

/* データ変更処理 */

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

FILE *fp;
char *fname = "comma.csv";

main()
{
	int no;
	int ret;
	printf("---会員管理システムメニュー---\n\n");
	printf("1.新規登録\n");
	printf("2.変更\n");
	printf("3.削除\n");
	printf("4.一覧表示\n");
	printf("No? ");
	ret=scanf("%d",&no);
	if(no == 1)
	{
		ret = add_record();
	}
	else if(no == 2)
	{
		ret = update_record();
	}
}

int update_record()
{
	int no;
	char name[100];
	char adress[100];
	char tel[100];
	char mail[100];
	int choice;
	int ret;

	printf("\n会員番号(0-10数値)? ");
	scanf("%d",&no);

	fp = fopen(fname,"r");
	if(fp == NULL)
	{
		printf("%sファイルが開けません\n",fname);
		return -1;
	}

	while((ret = fscanf(fp,"%[^,],%s,%s,%s,%s",no,&name,&adress,&tel,&mail)) != EOF)
	{
	}

	fclose(fp);
	return 0;

	printf("会員名称(漢字,英語)? name");
	scanf("%s",&name);
	printf("住所(漢字,数字50文字)? adress");
	scanf("%s",&adress);
	printf("電話番号(半角文字-で区切る)? tel");
	scanf("%s",&tel);
	printf("メールアドレス(半角英数字)? mail");
	scanf("%s",&mail);
	printf("新規登録しますか?(1:yes 2:no)? ");
	scanf("%d",&choice);

	if(choice == 2)
	{
		system("cls");
		main();
	}
}
キーボードで入力された会員番号に対して、その会員番号に該当する会員情報をテキストデータから、
抽出し、表示させて、それを変更したいのですが、上のコードのとおり、抽出の部分がうまくいっていません。
どなたかアドバイスよろしくお願いします。

box
記事: 1745
登録日時: 9年前

Re: ファイルデータの更新処理

#2

投稿記事 by box » 7年前

taz さんが書きました: 抽出の部分がうまくいっていません。
抽出の部分、というのは、
taz さんが書きました:

コード:

	while((ret = fscanf(fp,"%[^,],%s,%s,%s,%s",no,&name,&adress,&tel,&mail)) != EOF)
	{
	}
ここのことですか?だとすると、
noに&が付いていなくて、他の変数には&が付いているのは、なぜでしょうか。
また、while文によるループの中で何も処理を行なっていませんが、これは作成途中だから、
ということでよいのでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

taz

Re: ファイルデータの更新処理

#3

投稿記事 by taz » 7年前

whileの部分もif文か何かにしなくてはいけないと思っているのですが、
どう書けばよいかわかりません。
キーボード入力

入力値とファイル中のデータの値を比較

一致したデータを出力する

というような形にしたいのです。

box
記事: 1745
登録日時: 9年前

Re: ファイルデータの更新処理

#4

投稿記事 by box » 7年前

会員番号、名前、住所、電話番号、メールアドレスといった情報は、
各会員の属性情報だと思われますので、構造体か何かを使って一元的に管理するのが
よくある方法だと思います。
そして、会員全体の情報は構造体の配列か何かを使って管理する、と。

現在のupdate_record関数では、1人分の情報しか読めないようになっているように見えます。
データ構造をどう定義すべきかをよく考えてから、コードに落とすほうがいいような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

taz

Re: ファイルデータの更新処理

#5

投稿記事 by taz » 7年前

あとあとで、構造体を使用した形に改造していきたいと思っております。
現段階では、構造体は使わないで、機能の実現をしたいと思います。
1人の情報が読めるようになればいいと思うので、コードの書き方を教えてください。
キーボード入力

ファイル内の会員番号と比較

一致したデータを編集時の初期値として表示する

そのデータを書き換える

ファイルに保存しなおす

box
記事: 1745
登録日時: 9年前

Re: ファイルデータの更新処理

#6

投稿記事 by box » 7年前

add_record関数の中身は、トピック「出力される値がおかしい」の分を修正済だとして、
同関数とupdate_record関数の両方に、同じ配列定義が登場していないでしょうか。

今後、他の機能のための関数を用意するとき、また同じ配列定義をその関数の中に書くのでしょうか。
どういう風にされる予定ですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

taz
記事: 35
登録日時: 7年前
住所: 兵庫

Re: ファイルデータの更新処理

#7

投稿記事 by taz » 7年前

同じように書くと思います。

へにっくす

Re: ファイルデータの更新処理

#8

投稿記事 by へにっくす » 7年前

taz さんが書きました:あとあとで、構造体を使用した形に改造していきたいと思っております。
現段階では、構造体は使わないで、機能の実現をしたいと思います。
1人の情報が読めるようになればいいと思うので、コードの書き方を教えてください。
boxさんが指摘した、
box さんが書きました:noに&が付いていなくて、他の変数には&が付いているのは、なぜでしょうか。
を考えた方がよいですね。
fscanfで代入する変数を指定するときはすべてポインタですが、charの配列ならば、&はつけなくてもそれ自体がポインタと見なされます。逆にnoはintという配列でもなくポインタでもない変数ですがなぜ&がついていないんでしょうかねえ。&をつけるのが逆ですよ。
それと、fscanfが返すのは、代入された変数の数です。
5つ全部入ったのを確認するのであれば、EOFでなく5と比較すべきですねえ。

taz
記事: 35
登録日時: 7年前
住所: 兵庫

Re: ファイルデータの更新処理

#9

投稿記事 by taz » 7年前

コード:

/* 新規登録 */

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

FILE *fp;
char *fname = "comma.csv";

main()
{
	int no;
	int ret;
	printf("---会員管理システムメニュー---\n\n");
	printf("1.新規登録\n");
	printf("2.変更\n");
	printf("3.削除\n");
	printf("4.一覧表示\n");
	printf("No? ");
	ret=scanf("%d",&no);
	if(no == 1)
	{
		ret = add_record();
	}
	else if(no == 2)
	{
		ret = update_record();
	}
	//else if(no == 3)
	//{
	//	ret = del_record();
	//}
	//else if(no == 4)
	//{
	//	ret = disp_all();
	//
	//}
}

int add_record()
{
	int no;
	char name[100];
	char adress[100];
	char tel[100];
	char mail[100];
	int choice;

	printf("\n会員番号(0-10数値)? ");
	scanf("%d",&no);
	printf("会員名称(漢字,英語)? ");
	scanf("%s",&name);
	printf("住所(漢字,数字50文字)? ");
	scanf("%s",&adress);
	printf("電話番号(半角文字-で区切る)? ");
	scanf("%s",&tel);
	printf("メールアドレス(半角英数字)? ");
	scanf("%s",&mail);
	printf("新規登録しますか?(1:yes 2:no)? ");
	scanf("%d",&choice);

	if(choice == 2)
	{
		system("cls");
		main();
	}

	fp = fopen(fname,"w");
	if(fp == NULL)
	{
		printf("%ファイルが開けません\n",fname);
		return -1;
	}

	fprintf(fp,"%d,%s,%s,%s,%s",no,name,adress,tel,mail);


	fclose(fp);

	printf("%sファイル書き込みが終わりました\n",fname);
	return 0;
}

int update_record()
{
	int no;
	char name[100];
	char adress[100];
	char tel[100];
	char mail[100];
	int choice;
	int ret;
	int i;
	char a[100]="会員名称(漢字,英語)? ";
	char b[100]="住所(漢字,数字50文字)? ";
	char c[100]="電話番号(半角文字-で区切る)? ";
	char d[100]="メールアドレス(半角英数字)? ";
	//入力する変数領域
    char up_name[50];
    char up_adress[100];
    char up_tel[20];
    char up_mail[50];
    //ファイルから読み込んだ番号
    int rno;  

	printf("\n会員番号(0-10数値)? ");
	scanf("%d",&no);

	fp = fopen(fname,"r");
	if(fp == NULL)
	{
		printf("%sファイルが開けません\n",fname);
		return -1;
	}



	while(feof(fp)==0)
	{

	    if((ret = fscanf(fp,"%d,%[^,],%[^,],%[^,],%[^,]",&rno,name,adress,tel,mail)) == 5)
  	    {
		}
	}
		//入力した番号とファイルよ読み込んだ番号とをチェックする。同じなら変更する
		if(no==rno)
		{
                   printf("%s",name);
                   scanf("%s",&up_name);
                   printf("%s",adress);
                   scanf("%s",&up_adress);
                   printf("%s",tel);
                   scanf("%s",&up_tel);
                   printf("%s",mail);
                   scanf("%s",&up_mail);
                   printf("変更登録しますか?(1:yes 2:no)? ");
                   scanf("%d",&choice);
		   //選択がyesのとき書き込むデータとして変数に格納する
		   if(choice ==1)
		   {
			//ここで配列変数に格納する(次回にします)
		   }
		}	     
		
	
	fclose(fp);
	return 0;

	

	if(choice == 2)
	{
		system("cls");
		main();
	}
}

ここまで、変更しましたが、会員番号でうまく検索出来ません。なぜでしょうか?アドバイスお願いします。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ファイルデータの更新処理

#10

投稿記事 by へにっくす » 7年前

検索うんぬんより
次は構造体にして、
その次は配列を使って、
という手順を踏んだ方がいいと思いますが。

今のままじゃ1人分しかないので
検索とは言えないですw
written by へにっくす

taz(別PC)

Re: ファイルデータの更新処理

#11

投稿記事 by taz(別PC) » 7年前

こんばんは。
CSVファイル中には2件のデータが記述されています。
そのデータをキーボードから入力された値によって、
それぞれ出力させたいのですが、出来ないのでしょうか?

box
記事: 1745
登録日時: 9年前

Re: ファイルデータの更新処理

#12

投稿記事 by box » 7年前

taz(別PC) さんが書きました: CSVファイル中には2件のデータが記述されています。
そのデータをキーボードから入力された値によって、
それぞれ出力させたいのですが、出来ないのでしょうか?
できますよ。そのためのコードを書けば。
今のコードでは1人分にしか対応できていない、というだけのことだと思います。

# だから、まずデータ構造を決める方がいいって言ったのに…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

taz
記事: 35
登録日時: 7年前
住所: 兵庫

Re: ファイルデータの更新処理

#13

投稿記事 by taz » 7年前

もっと具体的に次にやるべき事を教えていただきますか?

box
記事: 1745
登録日時: 9年前

Re: ファイルデータの更新処理

#14

投稿記事 by box » 7年前

1)1人分の属性として考えているものをすべて書き出す。
2)書き出した項目をメンバーとする構造体を定義する。
3)その構造体では1人分のデータを管理するので、複数人のデータを管理するには構造体の配列というデータ構造を考える必要がある。
4)お手元にあるという、2人分のデータをCSVファイルから読み取って、定義済の構造体の配列に格納する。
5)構造体の配列の中身をすべて出力して、CSVファイルの内容と一致しているかどうかを確認する。

さしあたってはこんなところでしょうか。
データの追加とか検索とかいうのは、その後ですね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

taz
記事: 35
登録日時: 7年前
住所: 兵庫

Re: ファイルデータの更新処理

#15

投稿記事 by taz » 7年前

コード:

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

FILE *fp;
char *fname = "comma.csv";

struct member {
	int no;
	char name[20];
	char adress[20];
	char tel[20];
	char mail[20];
};

main()
{
	int no;
	int ret;
	printf("---会員管理システムメニュー---\n\n");
	printf("1.新規登録\n");
	printf("2.変更\n");
	printf("3.削除\n");
	printf("4.一覧表示\n");
	printf("No? ");
	ret=scanf("%d",&no);
	if(no == 1)
	{
		ret = add_record();
	}
	else if(no == 2)
	{
		ret = update_record();
	}
	//else if(no == 3)
	//{
	//	ret = del_record();
	//}
	//else if(no == 4)
	//{
	//	ret = disp_all();
	//
	//}
}

int update_record()
{
	struct member member[20]={0};
	int no;
	int choice;
	int ret;
	int i;
    char up_name[50];
    char up_adress[100];
    char up_tel[20];
    char up_mail[50];
    int rno;  

	printf("\n会員番号(0-10数値)? ");
	scanf("%d",&no);

	fp = fopen(fname,"r");
	if(fp == NULL)
	{
		printf("%sファイルが開けません\n",fname);
		return -1;
	}
	
	//while(feof(fp)==0)
	//{
		for(i=0;i<2;i++)
		{
			if((fscanf(fp,"%d,%[^,],%[^,],%[^,],%[^,]",&member[i].no,member[i].name,member[i].adress,member[i].tel,member[i].mail)) != EOF)
  			{
				printf("%s",member[i].name);
				printf("%s",member[i].adress);
				printf("%s",member[i].tel);
				printf("%s",member[i].mail);
			}
		}
	//}
		//入力した番号とファイルよ読み込んだ番号とをチェックする。同じなら変更する
		//if(no==rno)
		//{
                   //printf("%s",member[i].name);
                   //scanf("%s",&up_name);
                   //printf("%s",member[i].adress);
                   //scanf("%s",&up_adress);
                   //printf("%s",member[i].tel);
                   //scanf("%s",&up_tel);
                   //printf("%s",member[i].mail);
                   //scanf("%s",&up_mail);
                   //printf("変更登録しますか?(1:yes 2:no)? ");
                   //scanf("%d",&choice);
		   //選択がyesのとき書き込むデータとして変数に格納する
		   //if(choice ==1)
		   //{
			//ここで配列変数に格納する(次回にします)
		   //}
		//}	     
	
	fclose(fp);
	return 0;

	if(choice == 2)
	{
		system("cls");
		main();
	}
}
構造体を使用して、ファイルから読み込んだ値をその構造体に代入し、出力しようとしているのですが、
1番目のデータは出力されるのですが、2番目のデータが出力されません。
なぜでしょうか?データはCSV形式です。

non
記事: 1097
登録日時: 9年前

Re: ファイルデータの更新処理

#16

投稿記事 by non » 7年前

fscanf(fp,"%d,%[^,],%[^,],%[^,],%[^,]"
これの最後がまずいんじゃないの?
non

taz(別PC)

Re: ファイルデータの更新処理

#17

投稿記事 by taz(別PC) » 7年前

まずいとは、どうまずいのでしょうか?

takumi@0832080.com
記事: 38
登録日時: 8年前

Re: ファイルデータの更新処理

#18

投稿記事 by takumi@0832080.com » 7年前

taz(別PC) さんが書きました:まずいとは、どうまずいのでしょうか?
HINT 言われた周辺いじったり,色々試行錯誤してみたらいいと思う. 
(個人的には&(member.no)のが何言ってるのか分かりやすい.)

non
記事: 1097
登録日時: 9年前

Re: ファイルデータの更新処理

#19

投稿記事 by non » 7年前

CSVのファイルの行の最後にカンマはありますか?
non

taz
記事: 35
登録日時: 7年前
住所: 兵庫

Re: ファイルデータの更新処理

#20

投稿記事 by taz » 7年前

non さんが書きました:CSVのファイルの行の最後にカンマはありますか?
CSVのファイルの行の最後にカンマを入れましたがだめですね。

takumi@0832080.com
記事: 38
登録日時: 8年前

Re: ファイルデータの更新処理

#21

投稿記事 by takumi@0832080.com » 7年前

taz さんが書きました:
non さんが書きました:CSVのファイルの行の最後にカンマはありますか?
CSVのファイルの行の最後にカンマを入れましたがだめですね。
俺はそーいうことじゃないと思います.
ってか両方試そうよ.
それでだめなら最後にカンマないのになんで最後%[^,]なのってことでしょ.

顔顔プリン
記事: 10
登録日時: 9年前

Re: ファイルデータの更新処理

#22

投稿記事 by 顔顔プリン » 7年前

このサイトの
http://dixq.net/rp/11.html
ここをみればCSVの行の最後に何があるかわかると思いますよ

taz
記事: 35
登録日時: 7年前
住所: 兵庫

Re: ファイルデータの更新処理

#23

投稿記事 by taz » 7年前

コード:

for(i=0;i<2;i++)
		{
			if((fscanf(fp,"%d,%[^,],%[^,],%[^,],%s",&(member[i].no),member[i].name,member[i].adress,member[i].tel,member[i].mail)) != EOF)
  			{
				printf("%s\n",member[i].name);
				printf("%s\n",member[i].adress);
				printf("%s\n",member[i].tel);
				printf("%s\n",member[i].mail);
			}
		}
上記で、2つ目のデータも表示することが出来ました。
次に、キーボードで入力した番号で、出力情報を検索し、またそれを編集するようにしたいのですが、どのように記述したらよいでしょうか?箇条書きで教えていただけるとありがたいです。

taz
記事: 35
登録日時: 7年前
住所: 兵庫

Re: ファイルデータの更新処理

#24

投稿記事 by taz » 7年前

コード:

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

FILE *fp;
char *fname = "comma.csv";

struct member {
	int no;
	char name[20];
	char adress[20];
	char tel[20];
	char mail[20];
};

main()
{
	int no;
	int ret;
	printf("---会員管理システムメニュー---\n\n");
	printf("1.新規登録\n");
	printf("2.変更\n");
	printf("3.削除\n");
	printf("4.一覧表示\n");
	printf("No? ");
	ret=scanf("%d",&no);
	if(no == 1)
	{
		ret = add_record();
	}
	else if(no == 2)
	{
		ret = update_record();
	}
	//else if(no == 3)
	//{
	//	ret = del_record();
	//}
	//else if(no == 4)
	//{
	//	ret = disp_all();
	//
	//}
}


int update_record()
{
	struct member member[20]={0};
	int no;
	char name[100];
	char adress[100];
	char tel[100];
	char mail[100];
	int choice=0;
	int ret;
	int i=0;
	char a[100]="会員名称(漢字,英語)? ";
	char b[100]="住所(漢字,数字50文字)? ";
	char c[100]="電話番号(半角文字-で区切る)? ";
	char d[100]="メールアドレス(半角英数字)? ";
	//入力する変数領域7
    char up_name[50];
    char up_adress[100];
    char up_tel[20];
    char up_mail[50];
    //ファイルから読み込んだ番号
    int rno;  
	
	printf("\n会員番号(0-10数値)? ");
	scanf("%d",&no);

	fp = fopen(fname,"r");
	if(fp == NULL)
	{
		printf("%sファイルが開けません\n",fname);
		return -1;
	}
	
	while(feof(fp)==0)
	{
			if((fscanf(fp,"%d,%[^,],%[^,],%[^,],%s",&(member[i].no),member[i].name,member[i].adress,member[i].tel,member[i].mail)) != EOF)
  			{
				if(no==member[i].no)
				{
				   printf("%s\n",member[i].name);
                   scanf("%s\n",member[i].name);
                   printf("%s\n",member[i].adress);
                   scanf("%s\n",member[i].adress);
                   printf("%s\n",member[i].tel);
                   scanf("%s\n",member[i].tel);
                   printf("%s\n",member[i].mail);
                   scanf("%s\n",member[i].mail);
                   printf("%s\n","変更登録しますか?(1:yes 2:no) ");
                   scanf("%d\n",&choice);
				   if(choice==1)
				   {

				   }
				   else if(choice==2)
				   {
						system("cls");
						main();
				   }
				}
			}
			i++;
			
		
	}
	fclose(fp);
	return 0;
}
ここまで出来ました。しかし、最初の名前を入力するところで、2回入力しないと次の住所の項目に進みません。
また、最後の登録しますか?の質問の際に2を選択してもメイン関数に戻りません。どうしてでしょうか?
アドバイスお願いします。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: ファイルデータの更新処理

#25

投稿記事 by beatle » 7年前

main関数を再帰的に呼び出している(103行目)のは意図したことなのでしょうか?
普通のプログラムでは、自分でmainを呼び出すようなことはしません。

想像するに、update_record関数からmain関数へ戻りたいだけなのでしょうが、それならreturnすべきです。

taz
記事: 35
登録日時: 7年前
住所: 兵庫

Re: ファイルデータの更新処理

#26

投稿記事 by taz » 7年前

beatle さんが書きました:main関数を再帰的に呼び出している(103行目)のは意図したことなのでしょうか?
普通のプログラムでは、自分でmainを呼び出すようなことはしません。

想像するに、update_record関数からmain関数へ戻りたいだけなのでしょうが、それならreturnすべきです。
期待動作としては、意図してやっていることです。

コード:


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

FILE *fp;
char *fname = "comma.csv";

struct member {
	int no;
	char name[20];
	char adress[20];
	char tel[20];
	char mail[20];
};

main()
{
	int no;
	int ret;
	printf("---会員管理システムメニュー---\n\n");
	printf("1.新規登録\n");
	printf("2.変更\n");
	printf("3.削除\n");
	printf("4.一覧表示\n");
	printf("No? ");
	ret=scanf("%d",&no);
	if(no == 1)
	{
		ret = add_record();
	}
	else if(no == 2)
	{
		ret = update_record();
	}
	//else if(no == 3)
	//{
	//	ret = del_record();
	//}
	//else if(no == 4)
	//{
	//	ret = disp_all();
	//
	//}
}

int update_record()
{
	struct member member[20]={0};
	int no;
	char name[100];
	char adress[100];
	char tel[100];
	char mail[100];
	int choice=0;
	int ret;
	int i=0;
	char a[100]="会員名称(漢字,英語)? ";
	char b[100]="住所(漢字,数字50文字)? ";
	char c[100]="電話番号(半角文字-で区切る)? ";
	char d[100]="メールアドレス(半角英数字)? ";
	//入力する変数領域7
    char up_name[50];
    char up_adress[100];
    char up_tel[20];
    char up_mail[50];
    //ファイルから読み込んだ番号
    int rno;  
	
	printf("\n会員番号(0-10数値)? ");
	scanf("%d",&no);

	fp = fopen(fname,"r");
	if(fp == NULL)
	{
		printf("%sファイルが開けません\n",fname);
		return -1;
	}
	
	while(feof(fp)==0)
	{
			if((fscanf(fp,"%d,%[^,],%[^,],%[^,],%s",&(member[i].no),member[i].name,member[i].adress,member[i].tel,member[i].mail)) != EOF)
  			{
				if(no==member[i].no)
				{
				   printf("%s\n",member[i].name);
                   scanf("%s\n",member[i].name);
                   printf("%s\n",member[i].adress);
                   scanf("%s\n",member[i].adress);
                   printf("%s\n",member[i].tel);
                   scanf("%s\n",member[i].tel);
                   printf("%s\n",member[i].mail);
                   scanf("%s\n",member[i].mail);
                   printf("%s\n","変更登録しますか?(1:yes 2:no) ");
                   scanf("%d\n",&choice);
				   if(choice==1)
				   {
					   fprintf(fp,"%d,%s,%s,%s,%s",member[i].no,member[i].name,member[i].adress,member[i].tel,member[i].mail);
				   }
				   else if(choice==2)
				   {
						system("cls");
						main();
				   }
				}
			}
			i++;
	}
	fclose(fp);
	printf("%s\n","ファイル書き込みが終わりました\n");
	return 0;
}

現状このようなコードですが、不具合がいくつかあります。

コード:

			   printf("%s\n",member[i].name);
                   scanf("%s\n",member[i].name);
この部分で、2回入力しないと、次のコードに進みません。

コード:

printf("%s\n","変更登録しますか?(1:yes 2:no) ");
                   scanf("%d\n",&choice);
				   if(choice==1)
				   {
					   fprintf(fp,"%d,%s,%s,%s,%s",member[i].no,member[i].name,member[i].adress,member[i].tel,member[i].mail);
				   }
				   else if(choice==2)
				   {
						system("cls");
						main();
				   }
この部分で、choiceで、1か2を選択する前にプログラムが終わってしまいます。
どなたかアドバイスよろしくお願いします。

かずま

Re: ファイルデータの更新処理

#27

投稿記事 by かずま » 7年前

taz さんが書きました: 現状このようなコードですが、不具合がいくつかあります。

コード:

			   printf("%s\n",member[i].name);
                   scanf("%s\n",member[i].name);
この部分で、2回入力しないと、次のコードに進みません。
scanf の書式に "\n" を書いてはいけません。

taz
記事: 35
登録日時: 7年前
住所: 兵庫

Re: ファイルデータの更新処理

#28

投稿記事 by taz » 7年前

ありがとうございます。問題を解決することが出来ました。

しかし、fp = fopen(fname,"a"); の部分で上書き禁止にして、

fprintf(fp,"%d,%s,%s,%s,%s",no,name,adress,tel,mail); でファイルに書き込みを行っているのですが、

2行のデータが1行続きのデータになり、なにやらおかしたデータになってしまいます。

例)1,takesihta,明石市,090-3222-1234,a@yahoo.co.jp,takeuti,神戸市,090-3245-3221,v@yahoo.co.jp

taz
記事: 35
登録日時: 7年前
住所: 兵庫

Re: ファイルデータの更新処理

#29

投稿記事 by taz » 7年前

色々と質問させていただきましたが、なんとか解決しました。ありがとうございました。
最終コード↓

コード:

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

FILE *fp;
char *fname = "comma.csv";

struct member {
	int no;
	char name[20];
	char adress[20];
	char tel[20];
	char mail[20];
};

main()
{
	int no;
	int ret;
	printf("---会員管理システムメニュー---\n\n");
	printf("1.新規登録\n");
	printf("2.変更\n");
	printf("3.削除\n");
	printf("4.一覧表示\n");
	printf("No? ");
	ret=scanf("%d",&no);
	if(no == 1)
	{
		ret = add_record();
	}
	else if(no == 2)
	{
		ret = update_record();
	}
	//else if(no == 3)
	//{
	//	ret = del_record();
	//}
	//else if(no == 4)
	//{
	//	ret = disp_all();
	//
	//}
}

int add_record()
{
	int no;
	char name[100];
	char adress[100];
	char tel[100];
	char mail[100];
	int choice;

	printf("\n会員番号(0-10数値)? ");
	scanf("%d",&no);
	printf("会員名称(漢字,英語)? ");
	scanf("%s",&name);
	printf("住所(漢字,数字50文字)? ");
	scanf("%s",&adress);
	printf("電話番号(半角文字-で区切る)? ");
	scanf("%s",&tel);
	printf("メールアドレス(半角英数字)? ");
	scanf("%s",&mail);
	printf("新規登録しますか?(1:yes 2:no)? ");
	scanf("%d",&choice);

	if(choice == 2)
	{
		system("cls");
		main();
	}

	fp = fopen(fname,"a");
	if(fp == NULL)
	{
		printf("%sファイルが開けません\n",fname);
		return -1;
	}

	fprintf(fp,"%d,%s,%s,%s,%s\n",no,name,adress,tel,mail);


	fclose(fp);

	printf("%sファイル書き込みが終わりました\n",fname);
	return 0;
}

int update_record()
{
	struct member member[20]={0};
	int no;
	char name[100];
	char adress[100];
	char tel[100];
	char mail[100];
	int choice=0;
	int ret;
	int i=0;
	int g=0;
	char a[100]="会員名称(漢字,英語)? ";
	char b[100]="住所(漢字,数字50文字)? ";
	char c[100]="電話番号(半角文字-で区切る)? ";
	char d[100]="メールアドレス(半角英数字)? ";
	//入力する変数領域7
    char up_name[50];
    char up_adress[100];
    char up_tel[20];
    char up_mail[50];
    //ファイルから読み込んだ番号
    int rno;  
	
	printf("\n会員番号(0-10数値)? ");
	scanf("%d",&no);

	fp = fopen(fname,"r");
	if(fp == NULL)
	{
		printf("%sファイルが開けません\n",fname);
		return -1;
	}
	
	while(feof(fp)==0)
	{
			if((fscanf(fp,"%d,%[^,],%[^,],%[^,],%s",&(member[i].no),member[i].name,member[i].adress,member[i].tel,member[i].mail)) != EOF)
  			{
				if(no==member[i].no)
				{
				   printf("%s\n",member[i].name);
                   scanf("%s",member[i].name);
                   printf("%s\n",member[i].adress);
                   scanf("%s",member[i].adress);
                   printf("%s\n",member[i].tel);
                   scanf("%s",member[i].tel);
                   printf("%s\n",member[i].mail);
                   scanf("%s",member[i].mail);
                   printf("%s\n","変更登録しますか?(1:yes 2:no) ");
                   scanf("%d",&choice);
				   
				   if(choice==2)
				   {
						system("cls");
						main();
				   }
				}
			}
			i++;
	}
	fclose(fp);
	fp = fopen(fname,"w");
	fprintf(fp,"%d,%s,%s,%s,%s\n",member[0].no,member[0].name,member[0].adress,member[0].tel,member[0].mail);
	fclose(fp);
	fp = fopen(fname,"a");
	g=1;
	while(g<i-1)
	{
		
		fprintf(fp,"%d,%s,%s,%s,%s\n",member[g].no,member[g].name,member[g].adress,member[g].tel,member[g].mail);
		g++;
	}
	fclose(fp);
	printf("%s","ファイル書き込みが終わりました");
	return 0;
}


閉鎖

“C言語何でも質問掲示板” へ戻る