• ベストアンサー

C言語 テキストファイルから比較

earthの回答

  • ベストアンサー
  • earth
  • ベストアンサー率33% (1/3)
回答No.4

テストしてないので間違ってるかもしれませんが こんなのはどうでしょう? //lineにはfgetsなどで解析する文字列を代入してください char *line = "日付:2004/02/02 17時30分 体重:91.0 体脂肪率:21.0 除脂肪体重:71.9"; int n,i; char str[5]; n = strlen(line); //文字列を最後から見て行って':'を探します while(line[n] != ':'){   n--; } n++; i = 0; //文字列を数値に変換するatoi()は「.」があると正しく処理されないので取り除く必要があります while(line[n] != '\0'){   if(line[n] == '.'){     n++;   }   str[i] = line[n];   n++;   i++; } これで71.9の10倍である719の文字列がstrに入るのでそれをatoi()で数値に変換すればいいと思います。 ただしこれだと小数点第1位のみしか対応していません。 小数点がない場合や第2位まである場合にはさらに追加の処理が必要です。

ebinamori
質問者

お礼

回答ありがとうございます。 実際にプログラムまで作ってもらって非常にありがたいです。 ひとつ気になったのはatoiではなくatofを使えばもっと簡単に処理できるのではないですか? 早速作ってみようと思います。

ebinamori
質問者

補足

作ってみました。(めちゃくちゃ複雑…) void rank(void){ FILE *fp; int n,i,j,k[3]; double a,b[3]; char p[100][80],str[80]; for(i=0;i<3;b[i]=0,k[i++]=0); i=j=0; if((fp=fopen("tj.txt","r"))==NULL){ printf("ファイルを読み込めません。\n"); exit(1); } do{ fgets(p[j],79,fp); if(!feof(fp)){ n=strlen(p[j]); while(p[j][n-1]!=':')n--; while(p[j][n]!='k')str[i++]=p[j][n++]; } str[i]='\0'; i=0; a=atof(str); if(b[0]<a){ b[2]=b[1];b[1]=b[0];b[0]=a; k[2]=k[1];k[1]=k[0];k[0]=j; } else if(b[1]<a){ b[2]=b[1];b[1]=a; k[2]=k[1];k[1]=j; } else if(b[2]<a){ b[2]=a; k[2]=j; } j++; }while(!feof(fp)); printf("第1位 %s",p[k[0]]); printf("第2位 %s",p[k[1]]); printf("第3位 %s",p[k[2]]); fclose(fp); }

関連するQ&A

  • C言語でテキストファイルへのランダムアクセス

    こんにちは。 C言語を使い、CSVファイルで特定の通し番号が振られたレコード1行の値を 変数に格納したいのですがそれはできないのでしょうか? いろいろな参考書を確認するとバイナリファイルならランダムアクセスという方法で 任意の場所に直接アクセスできるらしいですが CSVなどのテキストファイルの場合、 一度ファイルの内容をすべて変数に読み込んで 変数内で検索するしかないのでしょうか? レコード数が多い場合でも変数にすべて読み込むしかないのでしょうか? ちなみにこんなファイルです。 001,山田 太郎,yamada tarou,東京,世田谷,08012341234 002,佐藤 二郎,satou jirou,北海道,釧路,09012341234 1カラム目は固定長、そのほかは可変長です。 ランダムアクセスで使うfseek関数はサイズで移動するらしいので 可変長のデータが含まれているとこの関数は使えないんじゃないかと思っています。 2カラム目には半角スペースも入っています。 1000レコードくらいです。 ご存知のかた、アドバイスお願いします。

  • テキストファイルと照合して・・・

    ご質問させて頂きます。 javaサーブレットで以下のような処理を行うにはどのようにしたら良いでしょうか? htmlの入力フォームがあります。そのフォームには、社員ID、部課ID、日付などの項目があります。そのデータが登録されているテキストファイルがあります。入力フォームで社員ID、部課ID、日付を入力したときに、テキストファイルのデータと照合させて、もしも一致するデータがなかった場合には、エラーメッセージを表示させる、という処理を行いたいんですがどうすればいいですか?

    • ベストアンサー
    • Java
  • プログラミング言語C

    名前(char name[20]),年齢(intage),身長(double height),体重(double weight)の4つのメンバを持つ構造体であるperson型を宣言し,以下のようなプログラムを作成せよ. 1.1つの構造体変数を宣言し,それぞれのメンバの値を入力させ表示する. 2.構造体person型の配列を作成し,3人分のデータを入力して表示する. 3.BMIを求める関数double bmi(person *p) を作成し,入力した3人分のデータからそれぞれのBMIを求め表示する. BMIとはBody Mass Indexのことで肥満度を表す指数 体重をw(kg),身長をt(m)とすると,BMI = w/t2 解答お願いします。

  • C言語につて、教えてください!!

    C言語について教えてください テキストファイル CD_DATA|45 DVD_DATA|601 MD_DATA|24 メイン関数と読み込み関数で、テキストファイルの'|'より後ろを構造体に書き込み エラー処理でテキストファイルに'|'が無い時エラーメッセージをだす。 テキストファイルの中の行数が違った時エラーメッセージをだす。 以上です、教えてくださいお願いします。

  • C言語について

    今、大学の授業でやさしいC第3版という本をつかってC言語の勉強していてわからない問題が出てきたので質問させてください。 問題9 Char型の変数ChとInt型の変数nを宣言し アルファベットの大文字1文字と 整数1つを入力させて 次の2つの事を実行する実行ファイルを作成せよ。 1.その文字を表示する。 2.文字コードを使ってその文字をn文字シフト させた文字を表示する。 Q: Zを1文字シフトさせた時Aが出力されるようにするには どうしたらよいか?アスキーコード表をにらんで考えよ。 問題10 キーボードから身長と体重を入力させて BMIを計算して表示する実行ファイルを 作成せよ。 BMI(Body Mass Index)とは 身長と体重から求める体格指数の1つで 身長 H (m)、体重 W (kg) の時 BMI=W/H2 で求められる。 これはまだ最初の方で第3章から第5章までのところをやっています。

  • 一人暮らし用の体脂肪率計

    これまで使っていた体重計が壊れてしまったので新しく体脂肪率計を買おうと思っています。 ただ今まで使ってた体重計は体脂肪率を出すためにはいちいち誰が乗ったかを入力しなければいけないものだったのですが、一人暮らしなので複数の人の体脂肪率を計測する必要はないためいちいち入力しなくていいものを探しています。 そういう一人用の体脂肪率は無いでしょうか?

  • 筋トレでの体脂肪率、体重減の方法は・・・

    筋トレ始めます。 現在、体重60kg、体脂肪率30%です。 体重52kg、体脂肪率20%くらいにしたいです。 増量期で体重増やして、減量期で減らして、また増量期で増やして・・・ってすれば、体脂肪率は下げていけますよね。 では、体重はどうなるのでしょうか。 増やして減らして増やして・・・で、変わらないのではないかと思うのですが・・・? 体重も減らしたい場合は、減量した分を超えないように増量することを繰り返せば、体重も減らしていくとができるのでしょうか??? 教えてください。 よろしくお願いします。

  • C言語 テキスト問題

    問題文の表示、回答の入力、答えの表示が行えるようにせよ。 以下に、問題文のファイルと答えのファイルに格納されている文字列を示す。 ・問題文(nazonazo_mondai): 自分の家をおんぶしている虫は何? ケガをしたときにつける毒は何? 銀色のチャックを大急ぎで集めている生き物は何? スポーツで破りたいものといえば何? 草が古くなったよ。どんな味がした? ・答え(nazonazo_kotae): カタツムリ 消毒 イソギンチャク 記録 苦い味 入力される値 カタツムリ 消毒 イソギンチャク 記録 苦い味 期待される出力値 第01問 ===================== 自分の家をおんぶしている虫は何? 第01問の答え: カタツムリ 第02問 ===================== ケガをしたときにつける毒は何? 第02問の答え: 消毒 第03問 ===================== 銀色のチャックを大急ぎで集めている生き物は何? 第03問の答え: イソギンチャク 第04問 ===================== スポーツで破りたいものといえば何? 第04問の答え: 記録 第05問 ===================== 草が古くなったよ。どんな味がした? 第05問の答え: 苦い味 制約 ・問題文のファイル名、答えのファイル名は以下を用いること。 問題文:nazonazo_mondai 答え:nazonazo_kotae ・それぞれのファイルを読み込めなかった場合の処理として、以下を出力しプログラムを終了する。 問題ファイルの読み込みに失敗しました。プログラムを終了します。 回答ファイルの読み込みに失敗しました。プログラムを終了します。 ・以下の構造体を用いてなぞなぞの問題と答えを読み込むこと。 構造体「MONDAI」を定義して、 「MONDAI」の構造体の中には以下のメンバを定義してください。 ただし、typedefを用いること。 【メンバ名】 【データ型】 【説明】 question 文字配列[要素数:256] 問題文を格納する変数 answer 文字配列[要素数:50] 答えを格納する変数 kaitou 文字配列[要素数:50] 入力した回答を格納する変数 ・fgets関数を使ってファイル内の文を読み込む際に、配列の大きさを引数として渡す必要がある。 その際にsizeof関数を用いること。 ・問題文の出力と答えの出力にはそれぞれ以下を使用すること 第%02d問 ===================== 第%02d問の答え: ポイント ・構造体のメンバ変数にkaitouを追加しています。ここに入力内容を格納すること。 ・問題文の表示、回答の入力、答えの表示を5回繰り返すようにする。 ・答えで表示する文字列は、nazonazo_kotaeのファイルから読み込んだ文字列を出力すること。 ※ kaitouに格納された文字列ではないことに注意してください。 サンプルケース1 入力値 カタツムリ 消毒 イソギンチャク 記録 苦い味 期待される出力値 第01問 ===================== 自分の家をおんぶしている虫は何? 第01問の答え:カタツムリ 第02問 ===================== ケガをしたときにつける毒は何? 第02問の答え:消毒 第03問 ===================== 銀色のチャックを大急ぎで集めている生き物は何? 第03問の答え:イソギンチャク 第04問 ===================== スポーツで破りたいものといえば何? 第04問の答え:記録 第05問 ===================== 草が古くなったよ。どんな味がした? 第05問の答え:苦い味

  • C言語 ファイル入出力について

    test.txtというテキストファイルに入力されている文字を読み込んでtest1.txtに7文字になったなら改行して2行目に書き込み、また2行目が7文字以上になったら3行目に書き込むというプログラムを作りたいのですがどうもうまくいきません。色々ネットで探したりしたのですがstrlenをうまく使うのかな~ぐらいしか見当はつきません・・・。 何かよいアドバイスをお願いします!m(_ _)m 例 test.txt --------------------------------- 私の一番好きな食べ物はリンゴです。 --------------------------------- ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ test1.txt ---------------------------------- 私の一番好きな 食べ物はリンゴ です。 ----------------------------------

  • 除脂肪体重には目標値があるの?

    大学生の男です。 「除脂肪体重には目標値がある」みたいなことを聞いたのですが本当ですか? BMI22や、体脂肪率は15~20%(男の場合)ぐらいが正常とはよく耳にしますが、除脂肪体重の目標値なんて聞いたことありません。 例えば、体脂肪率が低く、除脂肪体重が大きいという身体はその分筋肉もあるため、基礎代謝なども良いと思うので素晴らしいと思いますが、除脂肪体重で目標値があるなんて聞いたことがありません。 この値の体重には最低でもこれぐらいの除脂肪体重がほしいなんて事はあるのでしょうか? 調べても出てこないのでよろしくお願いします。 (もし、そういうのがあれば僕にふさわしい除脂肪体重を教えていただければ嬉しいです。) 身長176cm 体重58kg 体脂肪率12%です。 別にソフトマッチョとか目指しているわけではないです。せっかく体脂肪率が落ちてきたので維持がしたいのです。