Я пытаюсь прочитать каждую строку из файла и сохранить данные в каждой строке. Скажем, линия "x y z". Какие аргументы должна использовать функция getline для чтения и сохранения x, y и z по отдельности?
void readData(Gene *data, int num)
{
int codeNum;
int i = 0;
int k = num;
ifstream inputFile;
inputFile.open("example.data");
inputFile >> codeNum;
while(i < k){
getline(inputFile, data[i].geneCode, data[i].MutCode[0],
data[i].MutCost[0], data[i].MutCode[1],
data[i].MutCost[1]);
i++;
}
Это то, что у меня есть. Обратите внимание, что все переменные, которые я пытаюсь прочитать, являются строками, а k — это общее количество строк. при попытке скомпилировать я получаю сообщение об ошибке «нет подходящей функции для вызова getline ()» и что-то о «шаблоне функции-кандидата нежизнеспособно». Любая идея, что я делаю неправильно?
Всегда ищите ссылку на C++ по вашему выбору перед публикацией. Во-вторых, поищите в Интернете. В-третьих, используйте отладчик (если ваш код компилируется правильно).
Я настоятельно рекомендую вам использовать вектор структур (или классов), а не несколько параллельных массивов.
struct Mutation_Code_Cost
{
Mutation_Code_Type MutCode;
Mutation_Cost_Type MutCost;
};
struct Gene
{
Gene_Code_Type geneCode;
Mutation_Code_Cost mutation_info[2];
};
Затем вы можете перегрузить operator>>
для чтения структур из текстового потока:
struct Mutation_Code_Cost
{
Mutation_Code_Type MutCode;
Mutation_Cost_Type MutCost;
friend std::istream& operator>>(std::istream& input, Mutation_Code_Cost& mcc);
};
std::istream& operator>>(std::istream& input, Mutation_Code_Cost& mcc)
{
input >> mcc.MutCode;
input >> mcc.MutCost;
return input;
}
struct Gene
{
Gene_Code_Type geneCode;
Mutation_Code_Cost mutation_info[2];
friend std::istream& operator>>(std::istream& input, Gene& g);
};
std::istream& operator>>(std::istream& input, Gene& g)
{
input >> g.geneCode;
input >> g.mutation_info[0];
input >> g.mutation_info[1];
return input;
}
Вы можете прочитать из файла так:
std::vector<Gene> database;
Gene g;
std::string record;
while (std::getline(input_file, record))
{
std::istringstream record_stream(record);
if (record >> g)
{
database.push_back(g);
}
}
Обязательно прочтите,
std::getline
из CPPReference. Обратите внимание на количество параметров для всех перегрузок. Голосование за закрытие как опечатка.