2013-09-28 5 views
0

У меня есть файл ввода, который содержит некоторые данные в режиме координат Например (2,3,5) переводится в столбец 2, ряд 3 и уровень 5. Мне интересно, какой метод чтения в числах после использования getline (cin, string) для получения данных. Я не знаю, сколько цифр находится в точках данных, поэтому я не могу предположить, что 1-й символ будет иметь длину 1. Существуют ли библиотеки, которые могут быстрее решить проблему?Чтение неизвестной длины чисел

мой GamePlan до сих пор, что не закончил

void findNum(string *s){ 
int i; 
int beginning =0; 
bool foundBegin=0; 
int end=0; 
bool foundEnd=0 
    while(*s){ 
     if(isNum(s)){//function that returns true if its a digit 
      if(!foundBegin){ 
       foundBegin=1; 
       beginning=i; 
      } 

     } 
     if(foundBegin==1){ 
      end=i; 
      foundBegin=0; 
     } 
     i++; 
    } 
} 
+1

'станд :: istringstream' – user1520427

+1

Что такое' string', что делает 'в то время как (* s) {' хорошо? – jxh

+0

Я хочу, чтобы строка * s указывала на строку, вызывающую функцию. Поэтому, пока есть символ, на который нужно обратить внимание, цикл while работает –

ответ

1

Попробуйте это:

#include <iostream> 
#include <cstdlib> 
#include <sstream> 
#include <vector> 
#include <string> 

int main() { 
    std::vector <std::string> params; 

    std::string str; 
    std::cout << "Enter the parameter string: " << std::endl; 
    std::getline(cin, str);//use getline instead of cin here because you want to capture all the input which may or may not be whitespace delimited. 

    std::istringstream iss(str); 

    std::string temp; 
    while (std::getline(iss, temp, ',')) { 
     params.push_back(temp); 
    } 

    for (std::vector<std::string>::const_iterator it=params.begin(); it != params.end(); ++it) { 
     std::cout << *it << std::endl; 
    } 

    return 0; 
} 

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

Пример входных данных Строка:

1,2,3 

Выход:

1 
2 
3 

После того, как эти аргументы были проанализированы, можно затем преобразовать их из строк в (пример) целого числа с помощью следующих действий:

template <typename T> 
T convertToType(const std::string &stringType) { 
    std::stringstream iss(stringType); 
    T rtn; 
    return iss >> rtn ? rtn : 0; 
} 

который может быть использован следующим образом:

int result = convertToType<int>("1");//which will assign result to a value of 1. 

UPDATE:

Это теперь корректно работает на пробельных разделителями вход (для переноса строк, за исключением), как следующее:

1 , 2, 3 , 4 

Что дает:

1 
2 
3 
4 
+0

Почему они должны быть без пробелов?Разве они просто не должны быть единообразно разделены известным образом (IE, все, что помещается как разделительный символ для getline). – IllusiveBrian

+0

@Namfuak: Вы правы в 'getline'. Причина, почему мой пример должен быть ограниченным пробелом, - это «cin». Я отредактирую его, чтобы отобразить более правильную версию. – jrd1

+0

О, я понимаю, о чем вы говорите. Возможно, было бы разумнее использовать cin.getline(), если по какой-либо причине OP нуждается в поддержке пространства (например, если он хочет разрешить ввод типа «1, 2, 3»). – IllusiveBrian

0
#include <sstream> 

void findNums(const string &str, int &i, int &j, int &k) 
{ 
    std::stringstream ss(str); 
    char c; 
    ss >> c >> i >> c >> j >> c >> k; 
} 
1

jrd1-х Ответ довольно хороший, но если вы предпочли бы, чтобы функции f или преобразование символов в целые числа (и обратно) уже в стандартную библиотеку C (cstdlib). Вы бы искали атои.

http://en.cppreference.com/w/cpp/string/byte/atoi

0

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

#incude<ifstream> // for reading from file 
#include<iostream> 

using namespace std; 
int main() 
{ 

    int number; 
    ifstream fin ("YouFileName", std::ifstream::in); 

    fin >> number; // put next INT no matter how much digit it have in   number 
    while(!fin.eof()) 
    { 
      cout << number << endl; 
      fin >> number; // put next INT no matter how much digit it have in  number and it will ignore all non-numeric characters between two numbers as well.  
    } 
    fin.close(); 
    return 0; 

} 

Для более подробной информации смотрите here.

Примечание: Будьте осторожны при использовании его для символьных массивов и строк .. :)

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