我有一个代码,我正在尝试学习如何在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);
}
答案 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
。如果是这样,那么另一个问题就是修复。