テキストファイルの比較について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
こ~ふぃ

テキストファイルの比較について

#1

投稿記事 by こ~ふぃ » 16年前

明けましておめでとうございます。
早速ですが、質問です。

私は、c言語の素人で素人ながら音声認証プログラムを作成しようと考えているのですが、
その際に、本人と他人を区別するための特徴量という数値として
39次元×5コくらいの数値の比較が必要なのです。
数値が上から39×5コが書かれたテキストファイルを出力することは出来るのですが、
肝心の比較計算が出来ずに困っています。

テキストファイルには、

1.418060e+00
-5.935938e-01
1.012918e+00
.
.
.

のように出力されています。
同様なテキストファイルがいくつかあり、それぞれの上から1番目同士、2番目同士・・・と比較し、
差を出力させたいのですが、出来ません。
テキスト比較や、一致などの方法は調べたのですが、数値の計算の方法はわかりませんでした。
どのようにしたら良いでしょうか?ご指南のほどお願いします。

lbfuvab

Re:テキストファイルの比較について

#2

投稿記事 by lbfuvab » 16年前

fscanfで実数値として読み取って比較ですかね。

SCI

Re:テキストファイルの比較について

#3

投稿記事 by SCI » 16年前

それなら、ここの龍神録の「敵出現データ」と同じような方法でできますね。文字列として読み込んで、atofもしくはstrtodを使う方法です。
ただ、「一行に浮動小数値が一つだけ」という仕様が保証されるなら、fscanfでも簡単に実装できます。
ポイントは「文字列を実数に変換する」という部分です。

数値を読み込んでしまえば、差は簡単に計算できますね。

たかぎ

Re:テキストファイルの比較について

#4

投稿記事 by たかぎ » 16年前

C++でのやり方も書いておきます。
#include <iostream>
#include <fstream>
#include <algorithm>
#include <functional>
#include <iterator>
#include <vector>

int main()
{
    std::vector<double> a, b;
    std::ifstream ifsa("a.txt");
    std::ifstream ifsb("b.txt");

    std::copy(std::istream_iterator<double>(ifsa), std::istream_iterator<double>(), std::back_inserter(a));
    std::copy(std::istream_iterator<double>(ifsb), std::istream_iterator<double>(), std::back_inserter(b));

    std::transform(a.begin(), a.end(), b.begin(), a.begin(), std::minus<double>());
    std::copy(a.begin(), a.end(), std::ostream_iterator<double>(std::cout, "\n"));
}
ちょっと冗長なように見えますが、こうせざるを得ない理由があります。

こ~ふぃ

Re:テキストファイルの比較について

#5

投稿記事 by こ~ふぃ » 16年前

lbfuvabさん
SCIさん
たかぎさん
解答どうもありがとうございました。
fscanfで試行錯誤してみます。
またつまづいたら質問したいと思いますのでよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る