基于字符串,字符列表转换的数组

时间:2019-03-22 10:38:13

标签: c++

我创建了一个字符串类型的多重表。我将变量保留在内部(整数,字符串)。它给了我一个错误:

  

[错误]无法在分配中将'std :: string {aka std :: basic_string}'转换为'char'

我已经创建了一个树形函数集。该程序从具有以下格式的文件中创建多个数组:

11 10 2001
CSKA Moscow
12  1
Bayern Munich
...

程序:

void llegir(std::fstream &_contingut, std::string *_taula) {
  //declaro variables
  int dia, mes, any, puntsLocal, puntsVisitant, i = 0;
  std::string equipLocal, equipVisitant;

  while (!(_contingut.eof())) {
    //llegeixo arxiu
    _contingut >> dia >> mes >> any; //primera linea
    _contingut.ignore();
    getline(_contingut, equipLocal); //segona linea
    _contingut >> puntsLocal >> puntsVisitant; //tercera linea
    _contingut.ignore();
    getline(_contingut, equipVisitant); //quarta linea


    _taula[i][0] = dia;
    _taula[i][1] = mes;
    _taula[i][2] = any;
    _taula[i][3] = equipLocal.c_str();
    _taula[i][4] = puntsLocal;
    _taula[i][5] = equipVisitant.c_str();
    _taula[i][6] = puntsVisitant;

    i++;

  }

}
void creartaulaDelFitxer(std::string _fitxer, std::string *_taula, int &n_taula) {
  std::fstream arxiu;
  arxiu.open(_fitxer, std::fstream:: in );

  if (arxiu.is_open()) {
    std::cout << "existeix";
  } else {
    std::cout << "ERROR OBERTURA FITXER";
  }
  llegir(arxiu, _taula);
}
int main(int argc, char** argv) {
  std::string fitxer;
  std::string eurolliga[300][7];
  int n_taula = 0;

  std::cout << "INTRODUEIX NOM FITXER:" << std::endl;
  std::cin >> fitxer;
  creartaulaDelFitxer(fitxer, *eurolliga, int n_taula);
}

2 个答案:

答案 0 :(得分:2)

您正在混合使用指针,字符和字符串,这肯定会引起很多麻烦。尝试使用标准容器,例如std::stringstd::vector。如果需要很多字符串,请将它们放在向量中。当您有类似

的数据收集时
11 10 2001
CSKA Moscow
12  1
Bayern Munich

描述某个实体,为其创建一个class。然后,您可以为该类添加流运算符,以读取这些实体之一。如果您有实体的集合,请创建一个容器并为此添加流运算符。

示例:

#include <iostream>
#include <fstream>
#include <vector>

class Game {
    std::string equipLocal{};
    std::string equipVisitant{};
    int dia{}, mes{}, any{};
    int puntsLocal{}, puntsVisitant{};

public:
    friend std::istream& operator>>(std::istream&, Game&);
    friend std::ostream& operator<<(std::ostream&, const Game&);
};

// read one entity from an istream
std::istream& operator>>(std::istream& is, Game& g) {
    if(is >> g.dia >> g.mes >> g.any) {
        is.ignore();
        if(std::getline(is, g.equipLocal) && (is >> g.puntsLocal >> g.puntsVisitant)) {
            is.ignore();
            std::getline(is, g.equipVisitant);
        }
    }
    return is;
}

// write one entity to an ostream
std::ostream& operator<<(std::ostream& os, const Game& g) {
    return os << g.dia << " " << g.mes << " " << g.any << "\n"
              << g.equipLocal << "\n"
              << g.puntsLocal << " " << g.puntsVisitant << "\n"
              << g.equipVisitant << "\n";
}

class EuroLiga {
    std::vector<Game> games{};

public:
    bool Load(const std::string& filename) {
        std::ifstream arxiu(filename);
        if(arxiu) {
            games.clear();
            arxiu >> *this; // use this class' friend, operator>>
            return true;
        } else
            return false;
    }

    // support for basic non-const iteration over the 'games'
    std::vector<Game>::iterator begin() { return games.begin(); }
    std::vector<Game>::iterator end() { return games.end(); }

    friend std::istream& operator>>(std::istream&, EuroLiga&);
};

// read all entities from an istream
std::istream& operator>>(std::istream& is, EuroLiga& el) {
    Game tmp;
    while(is >> tmp) {
        el.games.push_back(std::move(tmp));
    }
    return is;
}

int main() {
    EuroLiga euroliga;
    std::string fitxer;

    std::cout << "INTRODUEIX NOM FITXER: ";
    std::cin >> fitxer;
    euroliga.Load(fitxer);

    // display all entities read from the file
    for(auto& g : euroliga) {
        std::cout << g << "\n";
    }
}

答案 1 :(得分:0)

void llegir(std::fstream &_contingut, std::string *_taula)

获取指向名为_taula的字符串的指针,这可能是您的数组。
但是,您可以像这样将某些东西分配给数组:

_taula[i][0] = dia; // allowed, but bad because char is basically a number.
[...]
_taula[i][3] = equipLocal.c_str(); // not allowed, you are assigning a char pointer to a char.

taula [i]是数组中的第i个字符串。然后通过放置[0]来分配给该字符串中的第一个字符。 dia不过是整数。

例如

std::string[] = {"Hello", "world", "I", "am", "alive"};
std::cout << string[1] << std::endl; // output "world"
std::cout << string[1][0] << std::endl; // output 'w'

您不能将字符串分配给单个字符。

作为旁注,您应该研究为数组索引声明一个枚举(及其大小的常量),以使其更加清晰并提高可维护性。

您可能应该做的就是为您创建一个结构或类,无论它是什么

struct whateverItIs {
    int dia, mes, any, puntsLocal, puntsVisitant;
    std::string equipLocal, equipVisitant;
};

在您的new中创建一个llegir实例,并将其推入您通过引用获得的std::vector的后面。
只要记住稍后delete(),特别是在向量超出范围之前。