2013-12-18 3 views
0

Так что моя задача состоит в том, чтобы прочитать строку из файла например:Чтение входных символов из одной строки файла

4. 7 3-+ 2 -3+ 

и кормить это в строковую переменную один за другим.

Одна проблема заключается в том, что между числами и символами существует 0 или более пробелов, но между одним числом и другим существует по крайней мере 1 пробел. Итак, как я могу различать каждый номер/символ?

+1

срезанных все пробелы прочь и прочитать его в Или изменить положение читателя на +1, если пробелы есть.. – Blacktempel

+0

В заголовке [''] (http://en.cppreference.com/w/cpp/header/cctype) есть такие вещи, как 'isalpha',' isdigit' и т. Д., Которые могут помочь здесь. Если вам нужна правильная локализация, вы можете получить в основном те же самые вещи с 'C++' локалями. – BoBTFish

+0

Что делать, если номер имеет двойной формат? Разве это не проблема? – user3115535

ответ

1

Предлагаю вам прочитать всю строку через getline(), а затем проанализировать строку по-символу и, возможно, построить другую строку.

cin.getline(myString); 
for (int i = 0; i < myString.size(); i++) { 
    if (myString[i] != ' ') { 

    if (myString[i] >= '0' && myString[i] <= '9' { 
     // do something with numbers; 
    } else { 
     // do something with characters. 
    } 

    } 
} 

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

char ch; 
cin >> std::noskipws; // needed to recognize the end of line character. 
while (cin >> ch && ch != '\n') { 
    if (ch != ' ') { 

    if (ch >= '0' && ch <= '9' { 
     // do something with numbers; 
    } else { 
     // do something with characters. 
    } 

    } 
} 
cin >> std::skipws; 
+0

Я думаю, что это именно то, что я искал. Спасибо! Только один вопрос. Скажем, я должен был положить все это в вектор 1 на 1, тогда как бы я вставлял число, подобное 4,5, в один блок в векторе? – user3115535

+0

Конечно, это означает, что его последний '-3' будет разобран как знак, за которым следует число. И что цифры будут всего лишь на одну цифру. Я думал примерно о том же (но используя 'getline', затем' >> 'на' istringstream', который автоматически пропускал пробелы), но обнаружил, что мне нужно больше одного взгляда на символ. –

+0

@ user3115535 Вам нужно будет разобрать символ числа по символу. Например, если вы столкнулись с 4, вам нужно будет следить за будущими персонажами, пока не получите «.». или больше номеров. –

0

В C++ вы можете прочитать всю строку в строку с getline(). Теперь строка поддерживает find_first_of() и find_first_not_of(), что позволяет эффективно читать до пробела, а затем пропускать ее.

Не тестировалось:

string delims = " \t" 
getline(file, line); 
int tokenStart, tokenEnd = 0; 
string token; 
tokenStart = line.find_first_not_of(delims, tokenEnd); 
tokenEnd = line.find_first_of(delims, tokenStart); 
// substr expects length, not end of substring 
token = line.substr(tokenStart, tokenEnd-tokenStart); 
Смежные вопросы