2014-02-16 5 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; 
    } 
} 

Является ли создание массива в строке, чтобы я не мог использовать для них значения float или double?

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

Ну, конечно, вы не можете поместить float или double в char, но вы можете преобразовать float или double в строку, а затем сохранить это. Ошибка возникает, потому что strtok возвращает char *, и вы пытаетесь сохранить это в токере переменной char. –

+0

Объявление токена как char * дает мне ошибку сегментации. Кроме того, если я храню числа как строку, как использовать их как float? – user3317141

ответ

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

token имеет тип char, strtok возвращает char*. Они не одного типа, и компилятор жалуется (логически) на это. strtok возвращает указатель на следующий токен обработанного ввода char*, поэтому нет смысла назначать его одному символу.

Компилятор действительно не может найти способ конвертировать из returnd 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

Segfault означает, что вы обращаетесь к недопустимой памяти. Единственный способ, который может произойти в 'strtok()', - это если 'buffer' недействителен, например, если он не завершен нулем. Другая проблема заключается в том, что второе измерение «команд» занимает 2 элемента, но вы позволяете 'counter' идти до 3, превышая границы этого второго измерения. –

0

Вы определили переменную фишку как имеющий Типу char

char token; 

в то время как функция strtok возвращает obhect типа char * .so этих заявлений

token = strtok (buffer, ","); 

и

token = strtok (NULL, ","); 

недействительны.Я думаю, что вы имели в виду

char *token; 

Также определены команды массива как массив элементов типа std::string

string teams[7][2]; 

Однако в функции get_input вы пытаетесь присвоить значение типа двойных к объекту типа станда :: строка

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

Кроме того, было бы правильнее, если функция была второй параметр, который определяет размер первого измерения массива

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

и будет называться

get_input(teams, 7); 

Вы должны проверить, сколько строк файла ввода.

Смежные вопросы