如何使转换功能正常工作?

时间:2017-04-12 04:15:28

标签: c++ parsing data-conversion

我有一个代码,我正在尝试学习如何在C ++中解析。我理解我所做的一切,但我不明白如何使用atoi(),atof(),strtod()等。我知道它应该做什么,但我不明白为什么编译器不喜欢它。我对错误的关注是“得分[line_count] = 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);
}

2 个答案:

答案 0 :(得分:0)

函数strtod()采用

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

但你只给它字符串。

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

  

引用已分配的char *类型的对象,其值由&gt;设置。函数到str后面的下一个字符的数值。   此参数也可以是空指针,在这种情况下不使用它。

所以你需要声明一个char指针来保存小数点后面的下一个字符,即使它不是一个。这允许您从单个字符串中提取多个双精度数,就像标记化器一样。

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

修改

正如Alex Lop指出的那样,你甚至没有将一根绳子传递到strtod,你正在传递一个浮子。看来你想将浮动转换为双倍?

答案 1 :(得分:0)

当然编译器并不喜欢它。请阅读strtod的说明。

  

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

     

string转换为   double

     

解析C字符串str将其内容解释为浮动内容   点编号(根据当前区域设置)并返回其值   作为double。如果endptr不是null指针,则该函数也会设置   endptr的值指向数字后面的第一个字符。

     

该函数首先丢弃尽可能多的空白字符(如   必要时,直到第一个非空白字符为止   找到。然后,从这个角色开始,获取尽可能多的字符   可能在遵循类似于浮动的语法的情况下有效   点文字(见下文),并将它们解释为数值。   指向最后一个有效字符后的其余字符串的指针   存储在endptr指向的对象中。

在您的代码中,您只向strtod传递一个类型为float的参数,并将返回的double结果存储到float的数组中。如果您想将float的值从一个变量移动到另一个变量,则不需要任何&#34;转换&#34;功能:

scores[line_count] = score; 

注意:我没有真正审核您的代码,因为您特别询问了scores[line_count] = strtod (score);。但在我查看了您修改score的方式后,可能应该是string而不是float。如果是这样,那么另一个问题就是修复。