2014-02-16 46 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); 

您應該檢查你有多少個文件的線路輸入。

相關問題