C++のifstreamのマイナスサイン

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

C++のifstreamのマイナスサイン

#1

投稿記事 by MoMo » 16年前

はじめまして。
C++のfstreamについて質問させて下さい。

学校の宿題で以下のように記されたファイルを読まないといけなく、困っています。
(2.00)
(2.56 + 8.33i)
(3.40i)
(9.66 - 2.34i)
この形式で書かれたファイルをfstreamで読み取り、実数と虚数をそれぞれ変数の中に読み込みたいのですが、うまくいきません…。マイナスサイン、ASCIIの45番を、ifstreamが読み取らないのです。
コードは以下です。
istream& operator>>(ifstream& in, ComplexNum& obj)
  {
    char ignore = ' ';
    char tempNumC[6]; 
    double tempNum = 0.0;
    double realNum = 0.0;
    double imgNum = 0.0;
    while(!in.fail() && in.peek() != ')')
    {
     while((in.peek() == ')' || in.peek() == '(') || (in.peek() == '-' || in.peek() == '+'))
       in.get(ignore);

     if(ignore == '-') 
     {
       in >> tempNum;
       if(!in)
       {
         in.clear();
         in.get(tempNumC, 6, 'i');
         tempNum = atof(tempNumC);
         ignore = 'i';
       }
       tempNum = tempNum * -1;
     }
     else 
     {
       in >> tempNum; 
       if(!in)
       {
         in.clear();
         in.get(tempNumC, 6, 'i');
         tempNum = atof(tempNumC);
         ignore = 'i';
       }
     }

     if(ignore == 'i')
     {
       imgNum = tempNum;
       break;
     }
     else
       realNum = tempNum;

       tempNum = 0.0;
    }
    obj.setter(realNum, imgNum);
    in.clear();
    in.ignore(100, '\n');

    return in;
  }
どうしてなのでしょうか…?
わかる方教えてくださるとありがたいです。
また、もしこの方法で駄目だとしたら、どのような方法でファイルを読み取ればいいでしょうか…?

よろしくお願い致します(_ _)

box

Re:C++のifstreamのマイナスサイン

#2

投稿記事 by box » 16年前

回答しようとする人のところで何も手を加えずに
コンパイル~実行できるよう、コード全体を載せてください。

>読み込みたいのですが、うまくいきません

どのようにうまくいかないのでしょうか?
コンパイルエラーですか?
実行時のエラーですか?
どんなエラーメッセージが出ますか?

標題にわざわざ「マイナスサイン」と書いてあるということは、

>(9.66 - 2.34i)

この場合だけがうまくいかないのでしょうか?

MoMo

Re:C++のifstreamのマイナスサイン

#3

投稿記事 by MoMo » 16年前

気が利かずにすみません。
以下が、全てのコードです。

Visual StudioのExpressで、コンパイルはできています。実行もできます。
けれど、実行時の読み取りでマイナスサインをスキップしているようで、(9.66 - 2.34i)の部分が、(9.66 + 2.34i)という風に読み取られてしまうのです。


メイン
#include "ComplexNum.h"
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    ifstream inf;
    ComplexNum* obj;
    obj = new ComplexNum[4];
    int index = 0;
 
    inf.open("input.txt");

    while(inf.peek() != EOF && index < 4){
        inf >> obj[index];
        if(inf.peek() == EOF)
            break;
        index++;
    }

     delete [/url] obj;
    inf.close();
    return 0;;
}
ヘッダー
#include <iostream>
#include <fstream>
using namespace std;

class ComplexNum{
public:
  ComplexNum();

  ComplexNum(double tempR, double tempI);

  friend istream& operator>>(ifstream& in, ComplexNum& obj);

  void setter(double tempR, double tempI);

private:

  double realNum;
  double imaginNum;
};
定義
istream& operator>>(ifstream& in, ComplexNum& obj)
  {
    char ignore = ' ';
    char tempNumC[6]; 
    double tempNum = 0.0;
    double realNum = 0.0;
    double imgNum = 0.0;
    while(!in.fail() && in.peek() != ')')
    {
     while((in.peek() == ')' || in.peek() == '(') || (in.peek() == '-' || in.peek() == '+'))
     {
       in.get(ignore);
       in.clear();
     }

     if(ignore == '-') 
     {
       in >> tempNum;
       if(!in)
       {
         in.clear();
         in.get(tempNumC, 6, 'i');
         tempNum = atof(tempNumC);
         ignore = 'i';
       }
       tempNum = tempNum * -1;
     }
     else 
     {
       in >> tempNum; 
       if(!in)
       {
         in.clear();
         in.get(tempNumC, 6, 'i');
         tempNum = atof(tempNumC);
         ignore = 'i';
       }
     }

     if(ignore == 'i')
     {
       imgNum = tempNum;
       break;
     }
     else
       realNum = tempNum;

       tempNum = 0.0;
    }
    obj.setter(realNum, imgNum);
    in.clear();
    in.ignore(100, '\n');

    return in;
  }

  void ComplexNum::setter(double tempR, double tempI)
  {
    realNum = tempR;
    imaginNum = tempI;
  }

MoMo

Re:C++のifstreamのマイナスサイン

#4

投稿記事 by MoMo » 16年前

補足です。


定義には、
#include "ComplexNum.h"
#include <iostream>
#include <fstream>
using namespace std;
を、インクルードしてあります。

ちなみにメインに様々なものをインクルードしてますが、それはこれから書くコードの為です。

MoMo

Re:C++のifstreamのマイナスサイン

#5

投稿記事 by MoMo » 16年前

in.ignore()

を活用して空白を読み飛ばすようにしたらうまく行きました。
どうしてなのかはよくわかりませんが、とりあえずできたのでよしとします。

閉鎖

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