Проблемы с C ++ при добавлении переменных в список векторов - PullRequest
1 голос
/ 12 апреля 2020

Я создал программу, которая читает различные текстовые файлы и сохраняет каждый файл в своем собственном векторном списке. Однако пропорция списка векторов программы не работает. Ниже представлен текстовый файл, над которым я сейчас работаю, а также сама программа

Текстовый файл

A:Head:1:2:15.
B:Torso:0:6:5.
C:Leg:0:4:6.
D:Arm:0:4:8.
E:Tail:0:6:2.

Основной файл

#include <iostream>
#include <string>
#include <conio.h>
#include <stdio.h>
#include "driver.h"
#include "implementation.cpp"
#include <fstream>
#include <vector>
using namespace std;

int main() {
readFile();
writeFile();
robotComplexity();
getch();
return 0;
}

Файл реализации, содержащий функции


#include <iostream>
#include <string>
#include <sstream> 
#include <fstream>
#include <fstream>
#include <vector>
using namespace std;

//declaration of parts variables
char partCode;
std::string partName;
int maximum;
int minimum;
int complexity;

std::vector<string> partsVector;
std::ifstream partsList("Parts.txt");
std::string outputFile = "output.txt";
std::string input;

std::string newChar;
std::stringstream convertChar;

void readFile() //function to read Builders, Customers and Parts text file
{

   std::string line;

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

    convertChar << partCode;
    convertChar >> newChar;


    // 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:
        newChar = token; //convert partCode from a char to a string 
        break;
      case 1:
        partName = token;
        break;
      case 2: maximum = stoi(token);
        break;
      case 3: minimum = stoi(token);
        break;
        case 4: complexity = stoi(token);
        break;
      default:
        break;
      }
      counter++;//increasing counter
    }

    partsVector.push_back(newChar);

    for(string x: partsVector)
    cout << x << endl;
}

}


double robotComplexity() { 


double complexity;

for(int i = 1; i < partsVector.size(); i++)
/*
if(newChar == "A") {
   cout << "Character: " << newChar;
} else   {
   cout << "Program isnt working! :(";


} */
   if(complexity > 100) {
      complexity = 100;
   }


cout << "\nThe Robot Complexity is: " << complexity << endl;
return complexity;
}


double robotVariability() {

double variability;


cout << "\nThe Robot Variability is: " << variability << endl;
return variability;

}

void writeFile() //writes to a file output.txt the end calculations. 
{

}

Код, с которым у меня в данный момент возникают проблемы:

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

    convertChar << partCode;
    convertChar >> newChar;

    // 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:
        newChar = token; //convert partCode from a char to a string 
        break;
      case 1:
        partName = token;
        break;
      case 2: maximum = stoi(token);
        break;
      case 3: minimum = stoi(token);
        break;
        case 4: complexity = stoi(token);
        break;
      default:
        break;
      }
      counter++;//increasing counter
    }

    partsVector.push_back(newChar);

    for(string x: partsVector)
    cout << x << endl;
}

Когда эта программа скомпилирована и выполнена, на консоль выводится следующее

A
A
B
A
B
C
A
B
C
D
A
B
C
D
E

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

A
B
C
D
E

Цель этого состоит в том, чтобы я знал, что функция может успешно идентифицировать каждую запись. Отметим, что это происходит с другими переменными, такими как partName. Я понял, что проблема заключается в том, как я добавляю переменные в вектор, но я не уверен, почему. Любая помощь будет отличной Спасибо.

1 Ответ

3 голосов
/ 12 апреля 2020

Таким образом, проблема заключается просто в том, что вы печатаете partsVector, это внутри вашего чтения l oop, когда оно должно быть после чтения l oop. Так что это должно быть

while (std::getline(partsList, line)) {
    ...
    partsVector.push_back(newChar);
}

for(string x: partsVector)
    cout << x << endl;

вместо этого

while (std::getline(partsList, line)) {
    ...
    partsVector.push_back(newChar);
    for(string x: partsVector)
        cout << x << endl;
}

Поскольку вы печатаете вектор деталей, когда вы его читаете, вы получаете эти повторяющиеся значения.

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