Как разбить элементы текстового файла в C ++ - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть текстовый файл с именем builders.txt, который содержит некоторые данные

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

В моем основном файле у меня есть объявление функции, относящееся к этому конкретному c текстовый файл

void Builder() {

std:string name;
int ability;
int variability;

}

это моя функция чтения файла

std::vector<std::string> lines;
std::string inputFile1 = "Builders.txt";
std::string inputFile2 = "Parts.txt";
std::string inputFile3 = "Customers.txt";
std::string outputFile = "output.txt";
std::string input;

void readFile(std::string const& inputFile1, std::string const& inputFile2, std::string const& inputFile3,
              std::vector<std::string>& lines) //function to read Builders, Customers and Parts text file
{
   std::ifstream file1(inputFile1);
   std::ifstream file2(inputFile2);
   std::ifstream file3(inputFile3);
   std::string line;

   while(std::getline(file1, line)) 
   {
      lines.push_back(line);

   }

     while(std::getline(file2, line)) 
   {
      lines.push_back(line);
   }

     while(std::getline(file3, line)) 
   {
      lines.push_back(line);
   }

}

Это моя попытка

std::vector<std::string> lines;

std::string inputFile1 = "Builders.txt";
std::istringstream newStream(inputFile1);
std::string input;

void readFile(std::string const& newStream,std::vector<std::string>& lines) 
{
   std::ifstream file1(newStream);
   std::string line;

   while(std::getline(file1, line,":")) 
   {
      lines.push_back(line);
      }

Когда я запускаю этот код, я получаю сообщение об ошибке "нет экземпляра функции перегрузки getline"

У меня вопрос к текстовому файлу: как я могу разбить текстовый файл, чтобы, например, Reliable Rover - это имя, 70 - это способность, а 1 - изменчивость для 1-й записи. Другим примером может служить имя Неряшливого Саймона, 20 - способность, а 4 - переменность. Если вопрос неясен или требует более подробной информации, пожалуйста, дайте мне знать

Спасибо

Ответы [ 2 ]

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

Как уже упоминалось @ thomas-sablik , простое решение - читать файл построчно и читать каждый элемент из строки:

std::ifstream f("builder.txt");
std::string line;

// read each line
while (std::getline(f, line)) {

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

    // then read each element by delimiter
    while (std::getline(ss, token, ':'))
      std::cout << token << std::endl;

  }

не забудьте включить sstream для использования строковых потоков.

Примечание: относится к cppreference , третий параметр std::getline равен delim и это символ, но вы передаете его в виде строки. Поэтому измените:

while(std::getline(file1, line,":")) 

на:

while(std::getline(file1, line,':')) 
0 голосов
/ 08 апреля 2020

Вот наивный подход, который я придумал:

std::string name;
int ability;
int variability;

char read;
while (ifs >> read) { // read until the end of the file
    // adding read into name
    while (read != ':') {
        name += read;
        ifs >> read;
    }

    ifs >> ability;
    ifs >> read; // Remove ':'
    ifs >> variability;
    ifs >> read; // Remove '.'

    // Code to deal with the three variables

    name = "";
}

Надеюсь, это поможет.

...