2014-10-30 4 views
-4

У меня есть текстовый файл, который читает так:Извлечение целых чисел из строки и преобразование в ints?

Department Max 
Bob 3 5 6 2 8 F1 
Frank 4 8 8 8 8 F2 
Jerry 7 9 9 0 9 F3 
William 0 0 12 13 14 F2 
Buck 3 4 10 8 8 4 6 F4 
Greg 1 2 1 4 2 F1 
Mike 3 4 4 8 4 F2 

Игнорируя имя, как я прочитал эти строки и извлечения этих чисел в виде отдельных целых чисел, так что я могу добавить их вместе?

До сих пор у меня есть это:

for (int i = 0; i < 10; i++) //Loop that checks the employee and their paygrade, 10 times for 10 lines of data 
    { 
     getline(inFile, s); //Gets next line in Salary.txt 
     string payGrade = s.substr(s.length() - 2, 2); //Checks the last two letters of the line to see paygrade 
     if (payGrade == "F1") 
     { 
      auto pos = s.find(' ', s.find('"')); 
      istringstream iss(s.substr(pos)); 


      F1employeeCounter++; 
     } 
     if (payGrade == "F2") 
     { 

      F2employeeCounter++; 
     } 
     if (payGrade == "F3") 
     { 

      F3employeeCounter++; 
     } 
     if (payGrade == "F4") 
     { 

      F4employeeCounter++; 
     } 
    } 

В основном я должен проверить, какой тип «платить класса» каждый сотрудник. Существует четыре разных типа оценок оплаты: F1, F2, F3, F4, и каждый из них имеет другой способ выплаты сотрудникам исходя из отработанных часов.

+0

Вы можете использовать 'atoi' для преобразования строк в Интс. Конечно, вам все равно нужно разбить строку. –

+0

http://stackoverflow.com/questions/7663709/convert-string-to-int-c + http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c может помочь – matsjoyce

+0

Если у вас есть вопрос, который так легко найти в Интернете, вы можете попытаться решить его, выполнив сначала поиск. Если у вас все еще есть проблемы после этого, покажите нам, что вы пробовали – PeterT

ответ

0
#include <iostream> 
#include <string> 
#include <sstream> 

int main() 
{ 
    std::istringstream iss("Bo 3 3 6 2 8\nFred 7 8 5 8 8\nJosh 7 9 4 0 1"); 

    while (iss.good()) //will exit this loop when there is no more text to read 
    { 
     std::string line; 

     //extract next line from iss 
     std::getline(iss, line); 

     //construct string stream from extracted line 
     std::stringstream ss(line); 

     std::string name; 
     int sum = 0; 
     int i = 0; 

     //extract name 
     ss >> name; 

     while(ss.good()) 
     { 
      //extract integer 
      ss >> i; 

      //add to the sum 
      sum += i; 
     } 

     //output name and sum 
     std::cout << name << ":" << sum << std::endl; 
    } 
} 

Выход:

Bo:22 
Fred:36 
Josh:21 
1

Далее следует пример того, как это можно сделать, если вы знаете заранее, что структура текста в файле всегда буду выглядеть так же, как в вашем примере.

Потоки традиционно используются в C++ для анализа данных (например, целых чисел) из текста. В этом случае итератор потока std::istream_iterator, обернутый вокруг std::istringstream, используется для синтаксического анализа целых токенов. Кроме того, для суммирования разобранных целых чисел используется стандартный алгоритм std::accumulate.

std::ifstream input{"my_file"}; 

// For every line read: 
for (std::string line; std::getline(input, line);) { 
    // Find position of first space after first citation character ("). 
    auto pos = line.find(' ', line.find('"')); 

    // Use position to copy relevant numbers part into a string stream. 
    std::istringstream iss{line.substr(pos)}; 

    // Accumulate sum from parsed integers. 
    auto sum = std::accumulate(std::istream_iterator<int>{iss}, 
           std::istream_iterator<int>{}, 
           0); 

    /* Do something with sum... */ 
} 

Live example

+0

Это не учитывает переменное число целых чисел в строке. –

+0

@cmbasnett OP не говорит, что имена будут * not * иметь фамилии или что каждая 4-я строка не будет говорить «время пиццы» ... Пример явно показывает 5 номеров в строке. – Snps

+0

Ответ изменился с момента моего комментария, это решение очень приятно. –

Смежные вопросы