- ベストアンサー
C言語でプログラムを書いています。
C言語でプログラムを書いています。 その中で、サンプルデータの入ったファイルを読み込み、 その中身を配列を用いて行列として整理したいのですが、どのような命令が必要でしょうか。 ファイルの中身は、以下のようになっています。 1:0.111 2:0.222.....600:0.999 ・ ・ ・ 1:0.122 2:0.233.....600:0.998 「数字:」の部分は使用しないため、実際はコロン以下の数値で組みたいと考えています 詳しいサイトの紹介でもかまいませんので、よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
AdobeのXMLみたいw でですが、解凍します。 ファイルをfopen~fgets~fcloseはわかりますよね? 注意fgetsは最後の改行コードも読み込むので、これを削除してくださいね。 それ以外は、strtokで分離すればOKです。 ですが、この場合のお勧めは、strchrの方がいいかも それと、プリスキャンが必要かも知れませんよ。 1ラインの最終が600ということで、固定長600でいいのかな? void filter(char *s) { while(*s) { switch(*s) { case 13: case 10: *s=0; default: return; } s++; } } typedef struct { float value[600]; /* 1からなので-1して格納する */ }HOGE; HOGE *get_data(char *filename) { FILE *fp; char buffer[1024*10]; /* 1行の最大の長さ */ int line; HOGE *hoge; int value_no; char *t; fp=fopen(filename,"rb"); if (!fp) { /* エラー処理はしてね */ } /* プリスキャン */ line=0; while(fgets(buffer,sizeof(buffer),fp)) { line++; } rewind(fp); hoge=(HOGE *)malloc(sizeof(HOGE)*(line+1)); line=0; while(fgets(buffer,sizeof(buffer),fp)) { filter(buffer); t=buffer; for (value_no=0;value_no<600;value_no++) { t=strchr(t,':')+1; /* ちょっとテクが使われてます */ hoge[line].value[value_no]=strtof(t,NULL); } line++; } /* アロケーターで+1しているので、必要ならデメリタも書いてもいい */ /* というのは、これでは何行読み込んだか、後から知る方法がないためです */ fclose(fp); return(hoge); }
その他の回答 (2)
- hanmemomo
- ベストアンサー率35% (205/580)
asuncion さんども まーそのつっこみがあるということは、意味がわかってもらえてるあたりが うれしいっすねw なれると、面倒で大体こうですね 13,10は文字に直すとCR LF 改行コードです 先頭にCRは古いMACでよくつかわれ、最初にLFはLinuxなどが多く CRLFと両方があるのが、MS-DOS系列のファイルの特性です 今回は、最初の1つ目でデメリタに出来るので、それをサンプルした時点で =0代入。これをEOT=EndOfTextというフラグに置き換えています、
お礼
細かな点まで指導いただきありがとうございます
- asuncion
- ベストアンサー率33% (2127/6289)
>case 13: >case 10: マジックナンバーにはコメントがあった方がいいかも。
お礼
ありがとうございます
お礼
細かな内容まで教えていただき、ありがとうございます 参考にさせていただきます