ポインタの扱い方・・・?

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

ポインタの扱い方・・・?

#1

投稿記事 by » 18年前

test_1.txtに書かれた文字を読み出して、[ ]で囲まれた所だけを取り出し、取り出したものを加工して別のファイルに書き込むプログラムを作っているます。

一文字ずつ取り出して判別し、フラグで管理すれば、出来るかと思い、現在は一文字ずつ取り出すプログラムは作れたのですが、これを塊ごとで管理したいのですが、どうすればいいのかが分かりません。
取り出した、塊は比較して条件判断に使えるようにしたいと思っています。
ご教授願えないでしょうか?
=====出力結果======
あああabc
-123456
fafa
dfafa
===================

=====ファイル名:test_1.txt======
[あああabc][-123456]

[fafa]
[dfafa]

=====================================

=====ファイル名:web.c=============

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

#define READ_SET 3
#define READ_START 2
#define READ_END 1

void FileOpen(FILE *fin, FILE *fout);	//ファイル関係の処理する所

int main()
{
	FILE *fin, *fout;
	char ss[256], name[256];
	
	printf("作成ファイル名を入力してください。");
	scanf("%s", name);
	
	if( (fin = fopen("test_1.txt", "r")) == NULL )
	{
		printf("ファイルが見つかりません。");
		exit(1);	//return ;	でもいいのかな?
	}
	
	if( (fout = fopen(name, "w")) == NULL )
	{
		printf("ファイルへの書き出しに失敗しました。");
		exit(1);
	}
	
	
	FileOpen(fin, fout);	//ファイル関係の処理する所

	fclose(fin);
	fclose(fout);
	
	return 0;
}

void FileOpen(FILE *fin, FILE *fout)
{
	int Read_1 = READ_END;	//読み込み設定
	int a;

	while ( feof(fin) == 0){
		a = fgetc(fin);
		if(a != -1)		//EOF(-1)がある時は無効化する為の【if】
		{
			if( a == '[' ){	//読み込み開始
				Read_1 = READ_SET;
			}else if( a == ']'){	//読み込み解除設定
				fprintf(fout, "\n");
				Read_1 = READ_END;
			}
			if( Read_1 == READ_START){	//書き出し
				fputc(a, fout);
			}
			if( Read_1 == READ_SET){
				Read_1 = READ_START;
			}
		}
	}
}

管理人

Re:ポインタの扱い方・・・?

#2

投稿記事 by 管理人 » 18年前

いったん2次元配列にファイル内容を全部格納する。
[/url]内の文字列のみ取り出す関数を作る。
メインからその関数へ2次元配列を渡す。

と言う流れではどうでしょうか?

fgetsを使えば、ファイル内容をそのまま2次元配列に入れることが出来ます。

#include <stdio.h>

#define N1 64
#define N2 256

void main(){
	int i,j;
	FILE *fin;
	char ss[N1][N2], name[256];
	
	printf("作成ファイル名を入力してください。");
	scanf("%s", name);
	
	if( (fin = fopen(name, "r")) == NULL ){
		printf("ファイルが見つかりません。");	return ;
	}

	while ( fgets(ss[i++],N2,fin) != NULL);

	for(j=0;j<i;j++)
		printf("%s",ss[j]);

	fclose(fin);
}
 
 

管理人

Re:ポインタの扱い方・・・?

#3

投稿記事 by 管理人 » 18年前

とりあえずファイルの内容をs1にいれてますね。

s1と、s1の中の[/url]内の文字列を入れるs2と、s1に入れた文字列の個数を渡し、
s2にs1の[/url]内の文字列を格納し、格納した個数を返すstrput関数を作ってみました。

ファイル名はtest.txt固定です。サンプル実行してみてください。
#include <stdio.h>

#define N1 64
#define N2 256

int strput(char s1[N1][N2],char s2[N1][N2],int n){
	//s1=調査対象文字列 s2=格納先文字列 n=s1に文字列が入っている個数
	int i=0,j=0,s=0,t=0;
	while(i<n){//文字列の個数分ループ
		if(s1[j]=='['){
			j++;//現在調べている要素が[ならその次から
			while(s1[j]!=']'){/[/url]になるまでループ
				s2[t++]=s1[j++];//s2に[から]までを格納。
			}
			s2[t]='\0';//終わったら終端記号を入れる
			s++;//格納先の文字列を次へ
			t=0;//tを0に
		}
		if(s1[j]=='\0'){//調査対象が文字列の最後なら
			i++;//次の文字列へ
			j=0;//jを0に
			continue;//戻る
		}
		j++;//調査対象を次の要素へ
	}
	return s;//格納した文字列の個数を返す。つまり[/url]の個数。
}

int main(){
	int i=0,j,s;
	FILE *fin;
	char s1[N1][N2],s2[N1][N2];
	
	if( (fin = fopen("test.txt", "r")) == NULL ){
		printf("ファイルが見つかりません。");	return 1;
	}

	while ( fgets(s1[i++],N2,fin) != NULL);

	s=strput(s1,s2,i);

	for(j=0;j<s;j++)//strput関数から返って来たs2に入っている文字列の個数分表示
		printf("%s\n",s2[j]);

	fclose(fin);
	return 0;
}

box

Re:ポインタの扱い方・・・?

#4

投稿記事 by box » 18年前

お目汚しですが、こんな例もあるってことで…。

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

#define LEN (256)

int main(void)
{
	char str[LEN], data[LEN], *p, *q, *r;
	int n;
	
	// 標準入力から1行分ずつ読み取れる間、続ける
	while (fgets(str, sizeof(str), stdin) != NULL) {
		
		// 文字列終端の'\0'が見つかるまで、その行の処理を続ける
		for (p = str; strchr(p, '\0');) {
			q = strchr(p, '[');			// '['の位置を探す
			if (q == NULL)				// 見つからなければ
				break;					// その行の処理をやめる
			r = strchr(q + 1, ']');		// '['とペアになるべき']'の位置を探す
			if (r == NULL)				// 見つからなければ
				break;					// その行の処理をやめる
			n = r - q - 1;				// '['と']'で挟まれた部分の長さ
			strncpy(data, q + 1, n);	// '['の次から、長さの分だけコピーする
			data[n] = '\0';				// 文字列終端をセットする
			printf("%s\n", data);
			p = r + 1;					// 次に処理するのは']'の後ろから
		}
	}
	return 0;
}

標準入力から読み取るようになっていますので、
ファイルから読み取る際はリダイレクトしてください。

仕様に合うよう、ご自由に手を加えてください。

Re:ポインタの扱い方・・・?

#5

投稿記事 by » 18年前

>管理人様
コピーして実行するとコンパイルは出来るのですが、実行時にエラーが3個ほど出ます。
何故でしょうか?

やっていることは大体分かったつもりなのですが、何処を見ても間違っている場所が分かりませんでした。
修正お願いできませんか?

>box様
感服しました。
自分に扱えるものの域の上を行っている感じがしますが、凄い参考になりました。
ありがとうございます。


最後になりましたが、管理人様、box様、返信が遅れて申し訳ありませんでした。

管理人

Re:ポインタの扱い方・・・?

#6

投稿記事 by 管理人 » 18年前

3つも出てました??
よく見てみるとiを初期化せずに使ってました。
いづれも警告だけだったんで、気づきませんでした。
出ている3つはエラーですか?警告ではなく?
上記コードを編集して新しいものにかえましたので、よければ試してみてください。

Re:ポインタの扱い方・・・?

#7

投稿記事 by » 18年前

>管理人様
できました!
ありがとうございます。
三回連続で、プログラムのエラーが表示されていました。
これから、このエラーが出たら初期化を疑えそうです!
本当にありがとうございました。

閉鎖

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