C ++ читает из текстового файла и разделяет его на переменные - PullRequest
0 голосов
/ 09 апреля 2020

Это блок кода из программы, которую я сейчас пишу

//declaration of builder variables
std::string name;
int ability;
int variability;

std::vector<string> builderVector;


std::ifstream buildersList("Builders.txt");
std::string outputFile = "output.txt";
std::string input;

void readFile() //function to read Builders file
{

   std::string line;

// read each line for builders
while (std::getline(buildersList, line)) {

    std::string token;
    std::istringstream ss(line);

    // then read each element by delimiter
    while (std::getline(ss, token, ':')) //spilt the variables 

      ss >> name >> ability >>  variability; 
      builderVector.push_back(token);
      cout << name;

}

И это мой текстовый файл

Reliable Rover:70:1.
Sloppy Simon:20:4.
Technical Tom:90:3.

При использовании расширителя возвращается следующее

70:1.20:4.90:3

До сих пор программа успешно считывает текстовый файл «Builders.txt» и, используя разделитель, разделяется на полную вершину, чтобы различать каждую запись, и сохраняет ее в векторе. То, что я сейчас пытаюсь сделать, это назначить каждому элементу, разделенному двоеточием, переменную. Так, например, Reliable Rover - это имя 70, это способность, а 1 - это изменчивость. В моем коде выше я попытался сделать это через строку

ss >> name >> ability >>  variability; 

Но когда я go возвращает значение, используя cout, он возвращает только только способность и переменность

Спасибо.

1 Ответ

2 голосов
/ 09 апреля 2020

Вы должны использовать свой внешний l oop для чтения строки, а свой внутренний l oop, чтобы разделить ее, используя разделитель.
Прямо сейчас, ваш внутренний l oop просто удаляет '.' в конце каждой строки.
Попробуйте что-то вроде:

while (std::getline(buildersList, line)) {
    line.pop_back();//removing '.' at end of line
    std::string token;
    std::istringstream ss(line);

    // then read each element by delimiter
    int counter = 0;//number of elements you read
    while (std::getline(ss, token, ':')) {//spilt into different records
      switch (counter) {//put into appropriate value-field according to element-count
      case 0:
        name = token;
        break;
      case 1:
        ability = stoi(token);
        break;
      case 2:
        variability = stoi(token);
        break;
      default:
        break;
      }
      counter++;//increasing counter
    }
    cout << name<<" "<<ability<<" "<<variability<<"\n";

}

При необходимости добавьте проверку ошибок (например, для stoi)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...