プロが教えるわが家の防犯対策術!

C言語でプログラムを書いています。
その中で、サンプルデータの入ったファイルを読み込み、
その中身を配列を用いて行列として整理したいのですが、どのような命令が必要でしょうか。
ファイルの中身は、以下のようになっています。
1:0.111 2:0.222.....600:0.999



1:0.122 2:0.233.....600:0.998
「数字:」の部分は使用しないため、実際はコロン以下の数値で組みたいと考えています
詳しいサイトの紹介でもかまいませんので、よろしくお願いします

A 回答 (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);

}
    • good
    • 0
この回答へのお礼

細かな内容まで教えていただき、ありがとうございます
参考にさせていただきます

お礼日時:2010/05/21 14:28

asuncion さんども


まーそのつっこみがあるということは、意味がわかってもらえてるあたりが
うれしいっすねw
なれると、面倒で大体こうですね
13,10は文字に直すとCR LF
改行コードです
先頭にCRは古いMACでよくつかわれ、最初にLFはLinuxなどが多く
CRLFと両方があるのが、MS-DOS系列のファイルの特性です
今回は、最初の1つ目でデメリタに出来るので、それをサンプルした時点で
=0代入。これをEOT=EndOfTextというフラグに置き換えています、
    • good
    • 0
この回答へのお礼

細かな点まで指導いただきありがとうございます

お礼日時:2010/06/04 14:20

>case 13:


>case 10:

マジックナンバーにはコメントがあった方がいいかも。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2010/06/04 14:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!