C ++ Только чтение последней строки при чтении текста из списка - PullRequest
0 голосов
/ 11 апреля 2020

Я написал функцию oop, которая сравнивает тип String с другой строкой, например

double robotComplexity() { 
  double complexity;
  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;
}

Однако, когда программа запускается, последний из оператора if возвращает "Программа не работает :( "

Однако в текстовом файле фактически есть запись, которая содержит символ A

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.

Я не уверен, почему функция l oop не распознает его. Ожидаемый вывод for вернул бы «A» в строковой форме, поскольку программа циклически повторяет записи в файле, пока не найдет символ A, связанный с переменной partCode. На данный момент он этого не делает.

My full Программа выглядит следующим образом:

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


//declaration of customer varialbes
std::string customerName;
std::string projectName;
std::string partNumber;;

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

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

std::vector<string> builderVector;
std::vector<string> partsVector;
std::vector<string> customerVector;

std::ifstream buildersList("Builders.txt");
std::ifstream partsList("Parts.txt");
std::ifstream customerList("Customers.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
      }
      //cout << "Part Code: " << newChar << endl;
      // cout << "Part Name: "<< partName << endl;
      // cout << "Maximum: "<< maximum << endl;
      // cout << "Minimum: "<< minimum << endl;
      // cout << "Complexity: "<< complexity << endl;
    }

    while (std::getline(customerList, 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: customerName = token; break;
        case 1: projectName  = token; break;
        case 2: partNumber   = token; break;
        default:                      break;
        }
        counter++;//increasing counter
      }
      // cout << "Customers name: " << customerName << endl;
      // cout << "Project name: "<< projectName << endl;
      // cout << "Part number: "<< partNumber << endl;
    }
}


double robotComplexity() { 

  double complexity;
  while(partsList.is_open) {
    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. 
{

}

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


#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;
}

Если кто-нибудь может предложить решение, которое было бы замечательно.

1 Ответ

0 голосов
/ 11 апреля 2020

Я только что переставил ваш код, как он должен выглядеть, и он работает правильно.

В кодировании наличие грязного кода означает наличие ошибок, которые вы не можете отследить. Разделите ваш код на мельчайшие логические компоненты и напишите код, чтобы он был читабельным ( без комментариев в коде! ). Я ничего не сделал, кроме реорганизации кода синтаксического анализа.

Кроме того, обратите внимание, что у вас есть точка (.) в конце каждой строки, вы должны либо удалить ее из ввода, либо обработать ее в коде.

// these are the streams used:
#include <istream>
#include <sstream>

std::vector<std::string> parse_stream(std::istream& stream)
{
    std::vector<std::string> res{};

    std::string line;
    while(std::getline(stream, line))
    {
        res.push_back(line);
    }

    return res;
}

std::vector<std::string> split_line(std::istream& stream, char delimiter)
{
    std::vector<std::string> res{};

    std::string token;
    while(std::getline(stream, token, delimiter))
    {
        res.push_back(token);
    }

    return res;
}

void print_vector(const std::vector<std::string>& vec)
{
    for (const std::string& str: vec)
    {
        std::cout << str << ", ";
    }

    std::cout << std::endl;
}

int main()
{
    std::string in_str = "A:Head:1:2:15\nB:Torso:0:6:5\nC:Leg:0:4:6\nD:Arm:0:4:8\nE:Tail:0:6:2";
    std::istringstream ss{in_str};

    auto parsed_stream = parse_stream(ss);
    print_vector(parsed_stream);

    for (const auto& line : parsed_stream)
    {
        std::istringstream line_ss{line};

        auto splited_line = split_line(line_ss, ':');
        print_vector(splited_line);
    }
}

Вывод:

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, 

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, 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...