2017-04-12 3 views
-1

私はC++で解析する方法を学びたいというコードを持っています。私はすべてのことを理解していましたが、atoi()、atof()、strtod()のようなものと作業する方法を理解していません。私はそれが何をすべきか知っていますが、なぜコンパイラがそれを好まないのか分かりません。エラーの私の焦点は "スコア[ライン_カウント] = strtod(スコア);"変換機能の仕組みは?

#include <iostream> 
#include <fstream> 
#include <string> 
#include <stdlib.h> 
#include <iomanip> 

using namespace std; 

int readScores(string inputFile, string name[], float scores[], int  array_size) 
{ 
//delcare variables 
ifstream infile; 
int line_count = 0; 
string line; 
string named; 
float score; 
char character; 
int word_index; 
string names[array_size]; 


// open input file 
infile.open(inputFile); 

//Check if file opens succesfully. 
if(infile.fail()) 
{ 
    cout << "File cannot open!!" << endl; 
    return -1; 
} 

while(getline(infile, line)) 
{ 
    cout << line << endl; 
    // PARSING GOES HERE 

    word_index = 0; 

    for(int i=0; i < (int)line.length(); i++) 
    { 
     character = line[i]; 

     if (character == ',') 
     { 
      names[line_count] = named; 
      named = ""; 
      word_index++; 
     } 
     else 
     { 
      if(word_index == 0) 
      { 
       named += character; 

      } 
      else if (word_index == 1) 
      { 
       score += character; 
       cout << character << " " << endl; 
      } 
     } 

    } 
scores[line_count] = strtod (score); 



    line_count++; 

} 

//close file 
infile.close(); 

//return line count 
return line_count; 
cout << line_count << endl; 
} 

int main(void) 
{ 
int array_size = 50; 
string inputFile = "Test.txt"; 
string name [array_size]; 
float scores [array_size]; 


readScores(inputFile, name, scores, array_size); 
} 
+0

"コンパイラはそれを好きではありません"非常に有用な説明ではありません。 – John3136

+0

それは私にエラーを与える。それは、 "floatをconst char *に引数1として変換することはできません"と言います。 – Robbie

+0

@Robbieなぜそれが役に立たないのですか? 'char *'の代わりに 'float'を渡しています! –

答えて

0

関数は、strtod()は

double strtod (const char* str, char** endptr); 

形式をとりしかし、あなたはそれに文字列を与えます。

ご覧のとおり、2つのパラメータ、ダブルに変換する文字列、「endptr」が必要です。 endptrを、値によって設定されるchar *型の既に割り当てられたオブジェクトへ

リファレンス>数値後STR内の次の文字の関数としてhereに記載されています。 このパラメータはnullポインタでもかまいません。この場合、使用されません。

したがって、存在しない場合でも、小数点以下の次の文字を保存するためには、charポインタを宣言する必要があります。これにより、トークナイザのように、単一の文字列から複数のdoubleを取り出すことができます。

char * endPtr; 
scores[line_count] = strtod(score, &endPtr); 

編集

アレックス垂れが指摘したように、あなたも、あなたはフロートを渡している、にstrtod文字列を渡していません。フロートをダブルにキャストしたいと思われるのでしょうか?

+0

申し訳ありません...私はatof(スコア)に変更すると言う...私はまだ同じエラーが発生します。 double afof(const char * _nptr) – Robbie

+1

atof()は文字列を浮動小数点数に変換するので、それでも浮動小数点数を渡します。私の提案は、それらを使う前に関数のマニュアルページを見て、彼らが何をしているのか、そしてどのパラメータを渡す必要があるのか​​を正確に知ることです。 – rhysvo

0

もちろん、コンパイラはそれを好まない。 strtodの説明をお読みください。

double strtod(const char * str、char ** endptr);

stringから doubleに変換してください。

は、(現在のロケールに応じて)浮動 小数点数としてその内容を解釈C-ストリングstrを解析しdoubleとしての価値 を返します。 endptrがnullポインターでない場合は、の値はendptrの値に番号の後の最初の文字を指すようにも設定されます。

この関数は、最初に空白以外の文字が見つかってから が見つかるまで、必要なだけ多くの空白文字( isspaceと同じ)を破棄します。次に、この文字から始めて、浮動小数点の ポイントリテラル(以下を参照)の構文に似た構文の後に有効な の文字数を有効にし、それらを数値として解釈します。 最後の有効な文字の後の文字列の残りの部分へのポインタは、endptrが指すオブジェクトに格納されている です。

そして、あなたのコードでは、タイプfloatであるstrtodだけつのパラメータに渡すとfloatの配列にdoubleの返された結果を格納します。あなたが別の変数からfloatの値を移動したい場合は、任意の「convertion」機能を必要としません:

scores[line_count] = score; 

注:について、あなたは特別尋ねたように私は本当にあなたのコードを確認しませんでしたscores[line_count] = strtod (score);。しかし、私がscoreをどのように変更したか見た後、おそらくstringで、floatではないはずです。もしそうなら、それは修正する別のポイントです。