2014-02-16 36 views
-1

我正在阅读文件和格式数组,以便我可以用其他的东西来处理它们,但是我一开始就卡住了。它说我不能从char *更改为char,但我的令牌不是char *。错误:无效从'char *'转换为'char'行26,36

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <cstring> 
#include <string> 
#include <stdio.h> 

using namespace std; 

void get_input(string teams[][2]) { 
    string infile; 
    double value; 
    char buffer[100]; 
    char token; 
    stringstream ss; 
    cout << "Enter the input file: "; 
    cin >> infile; 
    ifstream file; 
    file.open (infile.c_str()); 
    if (file.is_open()) { 
     int teamcounter = 0; 
     while (file.getline (buffer, 100)) { 
      int counter = 0; 
      token = strtok (buffer, ","); 
      while (token) { 
       if (counter == 0) { 
        teams[teamcounter][counter] = token; 
       } 
       else if ((counter == 1) || (counter == 2)) { 
        ss << token; 
        ss >> value; 
        teams[teamcounter][counter] = value; 
       } 
       token = strtok (NULL, ","); 
       counter++; 
      } 
      teamcounter++; 
     } 
     file.close(); 
    } 
    else { 
     cout << "Unable to open file"; 
    } 

    for (int i = 0; i< 7; i++){ 
     for (int j = 0; j<2;j++){ 
      cout << teams[i][j] << " "; 
     } 
     cout << endl; 
    } 
} 

正在将我的数组转换为字符串使我无法将浮点数或双精度值给他们吗?

int main() { 
    cout << "Welcome to the football bracket game!" << endl; 
    string teams[7][2]; 
    get_input(teams); 
}  

我输入文本格式是这样的:

Trojans, 0.80, 0.60 
Bruins, 0.20, 0.30 
Bears, 0.60, 0.50 
Trees, 0.50, 0.40 
Ducks, 0.40, 0.80 
Beavers, 0.50. 0.10 
Huskies, 0.80, 0.40 
Cougars, 0.10, 0.90 
+0

你知道错误来自哪里吗?你能告诉我们吗? – 0x499602D2

+0

那么,当然你不能把一个浮点数或一个double放到char中,但是你可以把一个浮点数或一个double转换成一个字符串,然后存储它。错误是因为strtok返回一个char *而你试图将它存储在char变量标记中。 –

+0

将令牌声明为char *给我分段错误。另外,如果我将数字存储为字符串,那么如何将它们用作浮点数? – user3317141

回答

2
char token; 
token = strtok (buffer, ","); 

tokenchar型,strtok返回char*。它们不是同一类型,编译器正在抱怨(逻辑上)。 strtok返回指向已处理输入的下一个标记的指针char*所以确实没有必要将它分配给单个字符。

编译器确实无法找到一种方法来从归还char*转换为char,没有什么奇怪的错误。

0

strtok()返回一个char*但您的token变量声明为char。它需要被声明为char*

更新:由于您使用的是C++,我强烈建议您使用C++,不要将C和C++混合在一起。忽略strtok()甚至存在,例如:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include <vector> 

struct Team 
{ 
    std::string Name; 
    double Value1; 
    double Value2; 
}; 

void get_input(std::vector<Team> &teams) 
{ 
    std::string infile; 
    std::ifstream file; 

    std::cout << "Enter the input file: "; 
    std::cin >> infile; 

    file.open (infile.c_str()); 
    if (!file.is_open()) 
    { 
     std::cout << "Unable to open file"; 
     return; 
    } 

    std::string line; 
    while (std::getline(file, line)) 
    { 
     Team team; 
     std::istringstream ss(line); 
     std::string token; 
     int counter = 0; 

     while (std::getline(ss, token, ",")) 
     { 
      switch (counter) 
      { 
       case 0: 
        team.Name = token; 
        break; 
       case 1: 
        std::stringstream(token) >> team.Value1; 
        break; 
       case 2: 
        std::stringstream(token) >> team.Value2; 
        break; 
      } 
      ++counter; 
     } 
     teams.push_back(team); 
    } 
} 

int main() 
{ 
    std::cout << "Welcome to the football bracket game!" << std::endl; 
    std::vector<Team> teams; 
    get_input(teams); 

    for (std::vector<Team>::iterator iter = teams.begin(); iter != teams.end(); ++iter) 
    { 
     std::cout << iter->Name << ": " << iter->Value1 << " " iter->Value2 << std::endl; 
    } 
}  
+0

我试着将标记声明为char *,但是当我执行时它给了我分段错误。我该如何解决这个问题? – user3317141

+0

段错误意味着您正在访问无效内存。在'strtok()'中可能发生的唯一方法是如果'buffer'无效,就像它没有终止null一样。另一个问题是'队'的第二维需要2个元素,但是你可以让'counter'去3,超过了第二维的界限。 –

0

你定义的变量标记为具有类型char

char token; 

而strtok函数返回char *类型的obhect。所以这些语句

token = strtok (buffer, ","); 

token = strtok (NULL, ","); 

无效。我觉得你的意思

char *token; 

而且你定义的数组队作为然而,在功能型std::string

string teams[7][2]; 

的元素的数组get_input您尝试double类型的值赋给一个std对象:: string

double value; 
//... 
teams[teamcounter][counter] = value; 

此外,如果函数具有指定数组第一维的大小的第二个参数,则会更加正确

void get_input(string teams[][2], int n); 

,并会被称为

get_input(teams, 7); 

您应该检查你有多少个文件的线路输入。

相关问题