C言語関係掲示板

過去ログ

No.463.文字列の後ろにある値を取り出す

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

スペースまでの文字列の取り出し方
投稿者---megu(2002/11/05 19:38:44)


テキストファイルから、文字列"data:"と"From;"の後にある値を取り出したいのですが、うまく取り出せなくて悩んでいます。
fscanfで,空白または改行まで一気に文字列をとりたくても、テキストファイルの文字列には100文字以上の文字列がたくさんあります。
用意する配列の要素を最小限に抑えて、上記の問題をなんとかすることができないでしょうか。

ファイルの中身はこんな感じです。
aaaaaaaaa bbbbb ;;;; oooo o pp
・・
data: 24
From: 45
wwwwwwwwwwwwwwwwwwwww dajdoadkaodaaaaaaaad okoooooo kok
・・・・・
data: 3
From: 4
・・・・・




No.3357

Re:スペースまでの文字列の取り出し方
投稿者---ともじ(2002/11/07 17:23:59)


こんにちは。

>テキストファイルから、文字列"data:"と"From;"の後にある値を取り出したいのですが、うまく取り出せなくて悩んでいます。
>fscanfで,空白または改行まで一気に文字列をとりたくても、テキストファイルの文字列には100文字以上の文字列がたくさんあります。
>用意する配列の要素を最小限に抑えて、上記の問題をなんとかすることができないでしょうか。

値を取り出すとありますが、10進数値に変換してもよろしいですか。
下記のプログラムではstrtolを使って10進数値に変換しているので、
数字以降は無視されています。

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

int main(int argc, char *argv[])
{
	FILE *fp;
	char *s1 = "data:";
	char *s2 = "From:";
	char buf[256];
	int len1, len2;

	if (argc < 2) {
		printf("ファイル名を指定してください\n");
		return (0);
	}

	if((fp = fopen(argv[1], "r" )) == NULL) {
		printf("入力ファイルがオープンできません\n");
		return (1);
	}

	len1 = strlen(s1);
	len2 = strlen(s2); 
	while (fgets(buf, sizeof(buf), fp) != NULL) {
		if (strncmp(buf, s1, len1) == 0)
			printf("%d\n", strtol(&buf[len1], NULL, 10));
		if (strncmp(buf, s2, len2) == 0)
			printf("%d\n", strtol(&buf[len2], NULL, 10));
	}

	fclose(fp);

	return (0);
}






No.3434

Re:スペースまでの文字列の取り出し方
投稿者---megu(2002/11/12 19:04:33)


ともじさんお返事ありがとうございます。
一文字ずつとりだしてスペースのになるまでの配列abcの文字列が"From:"か"Data:"であるならば処理を行いたいプログラムを作成しているのですが,以下のように作成したのですがうまくいきません。間違ってる点がありましたら教えてください。

while(!feof(fp)){

while((c=fgetc(fp))!=' '){
if(p==50){
p=0;
abc[p]='\0';
}
abc[p]=c;
p++;
}

if((strcmp(abc,"From:"))==0){
.....
.....
.....

}
 
if((strcmp(abc,"Data:"))==0){
.....
.....
.....

}


}

No.3437

Re:スペースまでの文字列の取り出し方
投稿者---ともじ(2002/11/12 19:55:23)


こんばんは。

>while(!feof(fp)){
>
> while((c=fgetc(fp))!=' '){
> if(p==50){
> p=0;
> abc[p]='\0';
> }
> abc[p]=c;
> p++;
> }
>
> if((strcmp(abc,"From:"))==0){
> .....
> .....
> .....
>
> }
> 
> if((strcmp(abc,"Data:"))==0){
> .....
> .....
> .....
>
> }
>
>
>}

文字列の比較にstrcmpを使っていますが、strcmpは比較している両文字列
の'\0'まで比べます。ですから、上記のようにファイルから読み込んだc
を格納しただけで'\0'を設定していない文字型配列abcと比べても一致
しません。
strncmpで文字数分比較するか、
 abc[p]=c;
 abc[p+1]='\0';
 p++;
のように、毎回'\0'を設定してください。
このとき、配列abcには'\0'分余計に要素数を宣言してください。