2017-04-12 36 views
-1

我有一段代码,我试图学习如何在C++中解析。我明白了我所做的一切,但我不明白如何使用atoi(),atof(),strtod()。我知道它应该做什么,但我不明白为什么编译器不喜欢它。我关注错误的是“scores [line_count] = strtod(score);”如何使转换功能起作用?

#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

它给了我一个错误。它说,“不能将const char *转换为参数1。” – Robbie

+0

@Robbie为什么它没有帮助?你传递'float'而不是'char *'! –

回答

0

功能的strtod()的形式为

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

但你只给它的字符串。

正如你所看到的,它需要两个参数,你希望转换成double的字符串和一个“endptr”。所述endptr描述here作为

参考类型char *的已分配的对象,其值由>该函数的数值后设置为下一个字符在str中。 该参数也可以是一个空指针,在这种情况下它不被使用。

因此,您需要声明一个字符指针来保存小数点后的下一个字符,即使不会是一个字符。这允许你从单个字符串中拉出多个双打,就像一个分词器。

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

编辑

亚历克斯罗布泊指出的那样,你甚至不传递一个字符串的strtod,你传递一个浮动。看起来你想将浮点数转换为double?

+0

好吧......说我把它改成atof(得分)......我仍然得到同样的错误。 double afof(const char * _nptr) – Robbie

+1

这是因为atof()将一个字符串转换为一个float,并且您仍然会将其传递给一个float。我的建议是在使用它们之前查看功能的手册页,以便您确切知道它们的功能以及需要传递的参数。 – rhysvo

0

当然编译器不喜欢它。请阅读strtod的描述。

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

string转换成 double

解析C-串str解释其内容作为浮动 点数目(根据当前环境),并返回它的值 作为double。如果endptr不是null指针,该函数还会将 的值设置为endptr以指向数字后面的第一个字符。

函数首先根据需要丢弃尽可能多的空白字符(如 isspace),直到找到第一个非空白字符为 。然后,从这个字符开始,采用与 一样多的字符,这些字符在类似浮点数的文字(参见下文)后可能是有效的,并将它们解释为数字值。 指向endptr指向的对象中最后一个有效字符后面的字符串其余部分的指针为 。

并在代码中传递给strtod只有一个参数是float型和double返回结果存储到的float秒的阵列。如果你想的float值从一个变量移动到另一个,你不需要任何“皈依”的功能:

scores[line_count] = score; 

注:我真的不检查代码,为您专门问scores[line_count] = strtod (score);。但在我看了你如何修改score后,也许它应该是string而不是float。如果是这样,那么这是另一个需要解决的问题。