2008-10-19 4 views
3

Я разбираю входной текстовый файл. Если я возьму входную строку по одной строке за раз, используя getline(), есть ли способ, чтобы я мог искать строку, чтобы получить целое число? Я думал о чем-то подобном getNextInt() в Java.Разбор целых чисел из строки

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

ответ

4

Если единственное, что там есть пробелы и целые числа, просто попробовать что-то вроде этого:

int i1, i2; 
stringstream ss(lineFromGetLine); 
ss >> i1 >> i2; 

или проще:

int i1, i2; 
theFileStream >> i1 >> i2; 
+0

как это сделать для строки не char * – Yoda 2012-06-19 12:18:32

+1

@Robert: Я понятия не имею, какова ваша жалоба. Вы можете построить строковый поток из `char *` так же легко, как и из `std :: string`. Если у вас другой вопрос, спросите новый. Но не голосуйте случайными ответами. – Eclipse 2012-06-19 14:22:15

0

Это больше, чем немного C-иш, но вы может использовать sscanf() в представлении строки C. Или вы можете использовать strtol() или родственников - также в представлении строки C.

Более C++ - ish путь, вероятно, будет использовать поток строк и экстрактор.

0

Я пробовал:

while (!inFile.eof()) { 
    getline (inFile,inputLine); 
    stringstream ss(inputLine); 
    ss >> rows >> columns; 
} 

и я получил следующее сообщение об ошибке:

"термин не оценить на функцию, принимающую 1 аргументы" в строке

сс (inputLine);

Редактировать: так что вы должны объявить поток строк в тот момент, когда вы дадите ему параметр. Корректированный код, измененный выше.

+0

BTW: Никогда не зацикливайтесь на eof(), но на read -> while (std :: getline (....)) – 2008-10-19 08:28:53

5

Есть несколько вещей, которые следует учитывать:
Предположим, у вас есть два номера на каждой строке, а затем текст, который вам неинтересен.

while(inFile >> rows >> columns) 
{ 
    // Successfully read rows and columns 

    // Now remove the extra stuff on the line you do not want. 
    inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 

отметить также, если единственное отделение целочисленных значений является «пустое пространство», то вам не нужно даже использовать линию игнорировать().

Вышеуказанное while() работает, потому что: оператор >> возвращает объект потока (ссылку). Поскольку объект потока используется в булевом контексте, компилятор попытается преобразовать его в bool, и у объекта потока есть оператор трансляции, который выполняет это преобразование (путем вызова good() в потоке).

Важно отметить, НЕ использовать линии

while(inFile.eof()) 

Если вы используете это, то вы попали в ловушку проблемы последней строки. Если вы прочитали все данные eof(), все равно false (поскольку это неверно, пока вы не попробуете прочитать EOF). Таким образом, в файле нет данных, но вы все равно входите в тело цикла. В вашем коде getline() затем выполняется и сбой (нет больше данных), теперь установлен EOF. Остальная часть цикла будет зависеть от того, как и где определяется значение inLine.

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

while(inFile.eof()) // Should probably test good() 
{ 
    getLine(inFile,inputline); 
    if(inFile.eof()) // should probably test good() 
    { 
     break; 
    } 
} 
0

Никогда не использовать.eof() для тестирования, можете ли вы прочитать или проверить, не прошло ли предыдущее чтение. Оба подхода потерпит неудачу в определенных ситуациях, потому что:

  • EOF не установлен, даже если нет никаких символов не остались, если не читать после конца не были предприняты еще (например, после GetLine последней строки, если есть символ новой строки в конце)
  • EOF устанавливается даже после успешного чтения, если операция чтения должна была заглянуть для следующего символа после конца, чтобы определить, что он должен прекратить чтение (например, после гели последней строки, если в конце не было символа новой строки)

В общем, вы должны ТОЛЬКО использовать .eof() после неудачного чтения, чтобы проверить, отказ был вызван завершением ввода.

Использование while (std::getline(...)) для зацикливания по линиям.

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