C言語関係掲示板

過去ログ

No.416.検索した名前の人のデータ削除と編集

[戻る] [ホームページ]
No.2900

データの編集・削除
投稿者---ナナ(2002/10/10 10:46:22)


こんにちは!!
最近、C言語にいきずまっているので、ぜひ教えて下さい!!
いきなりなのですが、C言語でのデータの削除と編集の仕方を教えて下さい。

例えば、DATAというファイルに

 ------- DATA.text---------------
1
2 akiyama 21
3 suzuki 19
4
5 tanaka 31
6
.
.
10
-----------------------------
といった内容が入っているファイルがあるとします。
 
 そのファイルの中の、suzuki 19の内容を suzuki 54 と書き換えて
 ファイルに保存したいのです。

そして、できれば suzuki 19 だけを編集するのではなく、akiyama 21
やtanaka 31も編集できるプログラムを書きたいと思っています。

 どうしても、ファイルのデータの追加になってしまって、suzuki 19が消えず
そのまま suzuki 54をファイルの最後に追加するプログラムに、なってしまい ます。

 あと、このファイルからtanaka 31という人を検索して、その人の 行だけを 削除する方法も教えて下さい。

 要するに、名前を検索して、その検索した名前の人のデータ削除と編集をする 方法(プログラム)を教えて下さい。
  
 あと付け加えてもう1つなんですが、

 while(fscanf("%s %d",name ,&cord) != EOF)
 で、ファイルの中身を読み込んでいるのですが、ファイルの中身を1行しか読 み込んでくれませ ん。
 一体何が原因なのでしょうか!?

 構造体を使ってプログラムを組んでいないっていうのが問題なのでしょか!?  
ぜひぜひ、教えて下さい!!
 質問ぜめですみません。色々ホームページや本を見て調べたのですが・・。
 お願いします!! 
  

No.2905

Re:データの編集・削除
投稿者---かずま(2002/10/10 20:31:30)


> 要するに、名前を検索して、その検索した名前の人のデータ削除と編集を
> する 方法(プログラム)を教えて下さい。

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

#define FILENAME  "DATA.text"
#define TEMPNAME  "DATA.temp"

int main(int argc, char **argv)
{
    char buf[1024];
    FILE *fp, *tp;
    int modify = 0;

    if (argc != 2 && argc != 3)
        return printf("usage: %s name [code]\n", argv[0]), 1;
    fp = fopen(FILENAME, "r");
    if (fp == NULL) return printf("can't open %s\n", FILENAME), 1;
    tp = fopen(TEMPNAME, "w");
    if (tp == NULL) return printf("can't create %s\n", TEMPNAME), 1;

    while (fgets(buf, sizeof buf, fp)) {
        if (strstr(buf, argv[1]) == NULL)
            fputs(buf, tp);
        else {
            if (argc == 3)
                fprintf(tp, "%s %s\n", argv[1], argv[2]);
            modify = 1;
        }
    }
    fclose(fp);
    fclose(tp);

    if (modify) {
        remove(FILENAME);
        rename(TEMPNAME, FILENAME);
    } else {
        remove(TEMPNAME);
        printf("%s not changed\n", FILENAME);
    }

    return 0;
}

このプログラムを repdel とすると、

 repdel suzuki 54

で、DATA.text の suzuki を含む行を suzuki 54 に書き換えます。

 repdel tanaka

で、DATA.text の tanaka を含む行を削除します。


> while(fscanf("%s %d",name ,&cord) != EOF)
> で、ファイルの中身を読み込んでいるのですが、ファイルの中身を1行しか
> 読 み込んでくれませ ん。
> 一体何が原因なのでしょうか!?

fscanf の第1引数は、FILE構造体へのポインタです。

No.2924

Re:データの編集・削除
投稿者---kamadoma(2002/10/12 01:26:18)

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

#define IN_FILE  "c:\\DATA.txt"
#define OUT_FILE "c:\OUT.txt"

typedef struct{
	int lineNo;
	char name[256];
	int age;
}KOJIN_INFO;

FILE *fileOpen(char *p_filename,char *p_mode);
void getCol(char *p_line,KOJIN_INFO *p_kojin_rec);

int main(int argc,char *argv[])
{
	FILE *in_fp;
	FILE *out_fp;
	char line[256];
	KOJIN_INFO kojin_rec;
	int menuNo;
	char str_menu[256];

	/*ファイルオープン処理*/
	out_fp = fileOpen(OUT_FILE,"w");
	in_fp = fileOpen(IN_FILE,"r");

	while(1){
	printf("メニュー番号を入力してください\n");
	printf("1.変更 2.削除 3.終了\n");
	gets(str_menu);
	menuNo = atoi(str_menu);

	/*変更処理*/
	if(menuNo == 1){
		/*引数の数チェック*/
		if(argc != 3){
			fprintf(stderr,"使用法(変更):プログラム名 行番号 年齢\n");
			continue;
		}

		/*ファイル読み込み処理*/
		while(fgets(line,256,in_fp) != NULL){
			/*構造体初期化*/
			memset(&kojin_rec,0x00,sizeof(kojin_rec));

			/*1レコードにおけるそれぞれのカラムを取得する*/
			getCol(line,&kojin_rec);
			
			/*実行時に指定した行番号と等しいとき*/
			if(atoi(argv[1]) == kojin_rec.lineNo){
				/*変更したいカラムを埋め込んで出力*/
				fprintf(out_fp,"%d %s %d\n",kojin_rec.lineNo,kojin_rec.name,atoi(argv[2]));
			}
			else{
				/*そのまま出力*/
				fprintf(out_fp,"%d %s %d\n",kojin_rec.lineNo,kojin_rec.name,kojin_rec.age);
			}

		}

		printf("[%d]行目を変更しました。\n",atoi(argv[1]));
	}
	/*削除処理*/
	else if(menuNo == 2){
		/*引数の数チェック*/
		if(argc != 2){
			fprintf(stderr,"使用法(削除):プログラム名 行番号\n");
			continue;
		}

		/*ファイル読み込み処理*/
		while(fgets(line,256,in_fp) != NULL){
			/*構造体初期化*/
			memset(&kojin_rec,0x00,sizeof(kojin_rec));

			/*1レコードにおけるそれぞれのカラムを取得する*/
			getCol(line,&kojin_rec);

			/*実行時に指定した行番号と等しくないとき*/
			if(atoi(argv[1]) != kojin_rec.lineNo){
				/*変更したいカラムを埋め込んで出力*/
				fprintf(out_fp,"%d %s %d\n",kojin_rec.lineNo,kojin_rec.name,kojin_rec.age);
			}

		}

		printf("[%d]行目を削除しました。\n",atoi(argv[1]));

	}
	else if(menuNo == 3){
		printf("終了します\n");
		exit(0);
	}
	else{
		printf("1−3を指定してください\n");
		continue;
	}
	}

	/*ファイルクローズ処理*/
	fclose(in_fp);
	fclose(out_fp);

	return 0;
}

FILE *fileOpen(char *p_filename,char *p_mode)
{
	FILE *fp;

	fp = fopen(p_filename,p_mode);
	if(fp == NULL){
		fprintf(stderr,"ファイル[%s]を開く事ができません。\n",p_filename);
		exit(1);
	}

	return fp;
}

void getCol(char *p_line,KOJIN_INFO *p_kojin_rec)
{
	char *p;
	int cnt = 0;
	
	p = strtok(p_line," ");
	while(p != NULL){
		cnt++;
		switch(cnt){
			case 1:
				p_kojin_rec->lineNo = atoi(p);
				break;
			case 2:
				strcpy(p_kojin_rec->name,p);
				break;
			case 3:
				p_kojin_rec->age = atoi(p);
				break;
		}
		p = strtok(NULL," ");
	}

}






No.2939

Re:データの編集・削除
投稿者---ナナ(2002/10/15 11:21:36)


かずまさん kamadomaさんありがとうございます。
プログラムの例示して頂いて、ぜひやってみます!!
本当にありがとうございました