ファイル中の選択1データの削除処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taz
記事: 35
登録日時: 11年前
住所: 兵庫

ファイル中の選択1データの削除処理

#1

投稿記事 by taz » 11年前

こんにちは。

ファイル中の選択1データを削除したいと思っております。

①キーボードから、削除したいNoを入力する。
②ファイルからNo,名前、住所、電話番号、メールアドレス等のデータを読み込み、構造体に代入する。
③削除したいNoの構造体データを削除する。
④ファイルに構造体データを書き込む。

コード:

#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_record();
	//
	//}
}


int del_record()
{
	struct member member[20]={0};
	int no;
	int choice=0;
	int i=0;
	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("\n%d",member[i].no);
				   printf("\n%s",member[i].name);
				   printf("\n%s",member[i].adress);
				   printf("\n%s",member[i].tel);
				   printf("\n%s",member[i].mail);
				   printf("\n%s","削除しますか?(1:yes 2:no)? ");
				   scanf("%d",&choice);
				   
				   if(choice==2)
				   {
						system("cls");
						main();
				   }
				}
			}
			i++;
	}
	fclose(fp);
            
             (削除処理を記述)
	
}

どのように削除処理を記述すればよいのかアドバイスをよろしくお願いします。

nil
記事: 428
登録日時: 12年前

Re: ファイル中の選択1データの削除処理

#2

投稿記事 by nil » 11年前

stdlibのremove関数が使えるみたいです

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

Re: ファイル中の選択1データの削除処理

#3

投稿記事 by taz » 11年前

涼雅 さんが書きました:stdlibのremove関数が使えるみたいです
remove関数はファイルを削除するためのものですよね?
今回は、csvファイル中の1データを削除したいのです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ファイル中の選択1データの削除処理

#4

投稿記事 by softya(ソフト屋) » 11年前

涼雅 さんが書きました:stdlibのremove関数が使えるみたいです
ファイル内の行削除ですからremoveはマズイと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ファイル中の選択1データの削除処理

#5

投稿記事 by softya(ソフト屋) » 11年前

削除自体は、配列にして前に詰めるとかリスト構造にして1つ抜くとかが一般的です。
書き出しは配列全体を書き出せばよいでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Ryo

Re: ファイル中の選択1データの削除処理

#6

投稿記事 by Ryo » 11年前

①キーボードから、削除したいNoを入力する。
②ファイルからNo,名前、住所、電話番号、メールアドレス等のデータをすべて読み込む
③ファイルに、消したい番号以外のデータを書き込む

これでどうでしょうか?

具体的には③にて、
for文などでループしながら書き込む際、対象のNOだけ、continueなどで処理を飛ばす

初級者
記事: 200
登録日時: 13年前

Re: ファイル中の選択1データの削除処理

#7

投稿記事 by 初級者 » 11年前

涼雅 さんが書きました:stdlibのremove関数が使えるみたいです
removeは、いくら何でもまずいだろw

# ちゃんと五・七・五になってるw

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

Re: ファイル中の選択1データの削除処理

#8

投稿記事 by non » 11年前

メニューですが、現在は

---会員管理システムメニュー---
1.新規登録
2.変更
3.削除
4.一覧表示

これに、
5.データの読み込み
6.データの保存
をつけたらどうでしょうか?

5.データの読み込みは、メニューに入る前に、自動的に読み込んでおいてもよいと思います。
いずれにしても、データを読み込みながら、削除したいデータを探す今のやり方は、あまり
よいとは思えません。
non

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

Re: ファイル中の選択1データの削除処理

#9

投稿記事 by taz » 11年前

non さんが書きました:メニューですが、現在は

---会員管理システムメニュー---
1.新規登録
2.変更
3.削除
4.一覧表示

これに、
5.データの読み込み
6.データの保存
をつけたらどうでしょうか?

5.データの読み込みは、メニューに入る前に、自動的に読み込んでおいてもよいと思います。
いずれにしても、データを読み込みながら、削除したいデータを探す今のやり方は、あまり
よいとは思えません。
そうですね。そういう作りに変更したいと思います。ありがとうございます。

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

Re: ファイル中の選択1データの削除処理

#10

投稿記事 by taz » 11年前

Ryo さんが書きました:①キーボードから、削除したいNoを入力する。
②ファイルからNo,名前、住所、電話番号、メールアドレス等のデータをすべて読み込む
③ファイルに、消したい番号以外のデータを書き込む

これでどうでしょうか?

具体的には③にて、
for文などでループしながら書き込む際、対象のNOだけ、continueなどで処理を飛ばす
このやり方で作成させていただきました。ありがとうございます!

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

Re: ファイル中の選択1データの削除処理

#11

投稿記事 by taz » 11年前

softya(ソフト屋) さんが書きました:削除自体は、配列にして前に詰めるとかリスト構造にして1つ抜くとかが一般的です。
書き出しは配列全体を書き出せばよいでしょう。
アドバイスありがとうございます。そういうやり方でやらせていただきました。

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

Re: ファイル中の選択1データの削除処理

#12

投稿記事 by taz » 11年前

削除処理は以下のようになりました。

コード:

#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_record();
	//
	//}
}

int del_record()
{
	struct member member[20]={0};
	struct member member1 = {EOF,EOF,EOF,EOF,EOF};
	int no;
	int choice=0;
	int i=0;
	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("\n%d",member[i].no);
				   printf("\n%s",member[i].name);
				   printf("\n%s",member[i].adress);
				   printf("\n%s",member[i].tel);
				   printf("\n%s",member[i].mail);
				   printf("\n%s","削除しますか?(1:yes 2:no)? ");
				   scanf("%d",&choice);
				   
				   if(choice==2)
				   {
						system("cls");
						main();
				   }
				}
			}
			i++;
	}
	i--;
	member[i]=member1;
	i = 0;
	fclose(fp);
	fp = fopen(fname, "w");
	fclose(fp);
	fp = fopen(fname, "w");
	while(member[i].no!=EOF)
	{
		if(no!=member[i].no)
		{
			fprintf(fp,"%d,%s,%s,%s,%s\n",member[i].no,member[i].name,member[i].adress,member[i].tel,member[i].mail);
		}
		i++;
	}
	fclose(fp);
	printf("%s","削除されました。");
	return 0;
}



アドバイスありがとうございました。またよろしくお願いします!

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

Re: ファイル中の選択1データの削除処理

#13

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

いやいーんだけどね?
ものすごく気になる箇所があるから指摘しとくよ。

49行目の初期化でEOFって何さ?
{0}で初期化するなら分かるけど。

89~90行目のfopen/fcloseは何?
無駄な処理はやめた方がいいよ。
written by へにっくす

閉鎖

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