C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: C言語 ファイルから読み込みし配列に格納


(過去ログ 102 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■60832 / inTopicNo.1)  C言語 ファイルから読み込みし配列に格納
  
□投稿者/ 若葉 (1回)-(2011/07/20(Wed) 16:54:08)

分類:[C/C++] 

C言語初心者です。

txtファイルに文字と数字がランダムに一行ずつ書き込まれているファイルを
文字と数字を判別してそれぞれ配列に格納したいです。
配列格納部分でエラーをはいてるとおもうのですがわかりません。。
ご教授お願いします。

以下のように300行書きこまれているファイルです。
test.txt
*******************
10
abc
55
652
abcd
6980
21
326
ab
******************


#include <stdio.h>
#include <string.h>
int main(void){
char *tp;
char s[500],*mozi[300];
int i=0,n=0,suuzi[300];
FILE *fp;
if((fp=fopen("test.txt","r"))==NULL){
printf("ファイルが開けません\n");
return 1;
}
while((fgets(s,256,fp))!=NULL){
if(isdigit(s)!=0){
suuzi[i]=atoi(s);
i++;
}
else{
mozi[n]=s;
n++;
}

}
fclose(fp);
for(i=0;i<300;i++){
printf("%c\n",mozi[i]);
}
for(i=0;i<300;i++){
printf("%d\n",suuzi[i]);
}
return 0;
}
引用返信 編集キー/
■60833 / inTopicNo.2)  Re[1]: C言語 ファイルから読み込みし配列に格納
□投稿者/ shu (872回)-(2011/07/20(Wed) 17:23:26)
No60832 (若葉 さん) に返信

> 	while((fgets(s,256,fp))!=NULL){
> 		if(isdigit(s)!=0){
> 			suuzi[i]=atoi(s);
> 			i++;
> 		}
> 		else{
> 			mozi[n]=s;
sの中身はいつまでも変化しないのでmozi[n]はすべて同じになります。

> 			n++;
> 		}


> 		
> 	}
>     fclose(fp);
> 	for(i=0;i<300;i++){
suuzi用のカウント変数を使いまわしているので、カウントした数がなくなってしまいます。

> 		printf("%c\n",mozi[i]);
300までまわしているので、nの値以上の配列には値が設定されていないのに参照してしまいます。

> 	}
> 	for(i=0;i<300;i++){
suuzi用のカウント変数を使いまわしているので、カウントした数がなくなってしまいます。

> 		printf("%d\n",suuzi[i]);
intなのでエラーにはなりませんが、ファイル読込した分より多く出力されてしまいます。

> 	}
> 	return 0;
> }

引用返信 編集キー/
■60834 / inTopicNo.3)  Re[2]: C言語 ファイルから読み込みし配列に格納
□投稿者/ 若葉 (2回)-(2011/07/20(Wed) 17:33:02)
ご返事ありがとうございます。

No60833 (shu さん) に返信
> ■No60832 (若葉 さん) に返信
>
>> while((fgets(s,256,fp))!=NULL){
>> if(isdigit(s)!=0){
>> suuzi[i]=atoi(s);
>> i++;
>> }
>> else{
>> mozi[n]=s;
> sの中身はいつまでも変化しないのでmozi[n]はすべて同じになります。
>
>> n++;
>> }
>
データの先頭どころか、値の大きいデータが入ってしまいます。
どこでループをかけたらよいのでしょうか?


>> printf("%d\n",suuzi[i]);
> intなのでエラーにはなりませんが、ファイル読込した分より多く出力されてしまいます。
>
>> }
>> return 0;
>>}

suuzi[]には数字をいれたいためintで定義したのですが
違うものとなると何で定義したらよいのでしょうか?



引用返信 編集キー/
■60840 / inTopicNo.4)  Re[3]: C言語 ファイルから読み込みし配列に格納
□投稿者/ επιστημη (2656回)-(2011/07/20(Wed) 19:57:43)
επιστημη さんの Web サイト
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void){
  char  s[500];
  char* mozi[300];
  int   suuzi[300];
  int i;
  int n;
  FILE *fp;

  if ( (fp = fopen("test.txt","r")) == NULL) {
    printf("ファイルが開けません\n");
    return 1;
  }
  
  i = 0;
  n = 0;
  while ( (fgets(s,256,fp)) != NULL ){
    /* 改行文字を取り除く */
    char* tp = strchr(s,'\n');
    if ( tp != NULL ) {
      *tp = '\0';
    }
    /* 最初の文字が数字ならば数字列とみなす */
    if ( isdigit(s[0]) != 0 ) {
      suuzi[i] = atoi(s);
      i++;
    } else {
      mozi[n] = _strdup(s); /* 複製を作る */
      n++;
    }
  }
  fclose(fp);

  {
    int t;

    printf("--- strings ---\n");
    for ( t = 0; t < n; t++ ){
      printf("%s\n",mozi[t]);
      free(mozi[t]); /* 複製を破棄 */
    }
    printf("--- numbers ---\n");
    for( t = 0; t < i; t++){
      printf("%d\n",suuzi[t]);
    }
  }
  return 0;
}

引用返信 編集キー/
■60844 / inTopicNo.5)  Re[4]: C言語 ファイルから読み込みし配列に格納
□投稿者/ 堀江伸一 (40回)-(2011/07/20(Wed) 22:05:04)
1abczという文字とか
0.842
.842
1.23457E+11
-143
という数字や16進数や8進数はありますか?
1.23.145や-0のようなエラーデータがある場合はどうしますか?
引用返信 編集キー/
■60856 / inTopicNo.6)  Re[4]: C言語 ファイルから読み込みし配列に格納
□投稿者/ 若葉 (4回)-(2011/07/21(Thu) 12:04:02)
ご教授ありがとうございます。

No60840 (επιστημη さん) に返信
> i = 0;
> n = 0;
> while ( (fgets(s,256,fp)) != NULL ){
> /* 改行文字を取り除く */
> char* tp = strchr(s,'\n');
> if ( tp != NULL ) {
> *tp = '\0';
> }
> /* 最初の文字が数字ならば数字列とみなす */
> if ( isdigit(s[0]) != 0 ) {
> suuzi[i] = atoi(s);
> i++;
> } else {
> mozi[n] = _strdup(s); /* 複製を作る */
> n++;
> }
> }
> fclose(fp);

これではs変動できていないですよね?
s[0]の0を変数にしてforでループかければいいのでしょうか・・?

引用返信 編集キー/
■60857 / inTopicNo.7)  Re[5]: C言語 ファイルから読み込みし配列に格納
□投稿者/ 若葉 (5回)-(2011/07/21(Thu) 12:05:18)
No60844 (堀江伸一 さん) に返信
> 1abczという文字とか
> 0.842
> .842
> 1.23457E+11
> -143
> という数字や16進数や8進数はありますか?
> 1.23.145や-0のようなエラーデータがある場合はどうしますか?

そのような難しいデータは入っていなかったので大丈夫でした。

引用返信 編集キー/
■60859 / inTopicNo.8)  Re[5]: C言語 ファイルから読み込みし配列に格納
□投稿者/ shu (876回)-(2011/07/21(Thu) 12:25:48)
No60856 (若葉 さん) に返信

>> } else {
>> mozi[n] = _strdup(s); /* 複製を作る */
・・・
>
> これではs変動できていないですよね?
> s[0]の0を変数にしてforでループかければいいのでしょうか・・?
_strdupが新しい領域を確保してsの中身をコピーして新しい領域へのポインタを返すので
mozi[n]はそれぞれの文字列が入ります。
新しく領域を確保しているので最後にfreeで解放する必要があります。

引用返信 編集キー/
■60864 / inTopicNo.9)  Re[6]: C言語 ファイルから読み込みし配列に格納
□投稿者/ 若葉 (6回)-(2011/07/21(Thu) 17:00:36)
No60859 (shu さん) に返信
> ■No60856 (若葉 さん) に返信
>
> >> } else {
> >> mozi[n] = _strdup(s); /* 複製を作る */
> ・・・
>>
>>これではs変動できていないですよね?
>>s[0]の0を変数にしてforでループかければいいのでしょうか・・?
> _strdupが新しい領域を確保してsの中身をコピーして新しい領域へのポインタを返すので
> mozi[n]はそれぞれの文字列が入ります。
> 新しく領域を確保しているので最後にfreeで解放する必要があります。
>

ありがとうございます。
しかし、コンパイルでメモリエラーを起こしてしまいます。
原因がわかりません。
引用返信 編集キー/
■60867 / inTopicNo.10)  Re[7]: C言語 ファイルから読み込みし配列に格納
□投稿者/ 774RR (602回)-(2011/07/21(Thu) 19:32:05)
No60840 のコードは strdup() が SysV 標準な以外は C 言語標準に合致している。
正しく動くことを俺も確認済みだし、このコードに対してコンパイルエラーが出るとは考えにくい。

本当に「コンパイラが」メモリエラーを起こしているのであれば、それはコンパイラのバグなので
そんなバグっているコンパイラなど捨て捨て。
実際にはコンパイラがバグっているのではないに1票。

とりあえず処理系名(OS名、コンパイラ名)と、表示されたエラーメッセージを
一字一句そのまま公開すると何かわかるかもしれない。
引用返信 編集キー/
■60868 / inTopicNo.11)  Re[8]: C言語 ファイルから読み込みし配列に格納
□投稿者/ επιστημη (2657回)-(2011/07/21(Thu) 19:49:11)
επιστημη さんの Web サイト
「s変動」てナニ?

_strdup() がありません、なんてなエラーなら

mozi[n] = strcpy((char*)malloc(strlen(s)+1),s); /* 複製を作る */

とかやってみて。

引用返信 編集キー/
■60870 / inTopicNo.12)  Re[9]: C言語 ファイルから読み込みし配列に格納
□投稿者/ shu (877回)-(2011/07/21(Thu) 21:17:35)
No60868 (επιστημη さん) に返信
> 「s変動」てナニ?

たぶん

わたしの
> sの中身はいつまでも変化しないのでmozi[n]はすべて同じになります。
を読み替えたんだと思います。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -