istringsteam с разрывами строк

Хорошо, я прочитал, что если у нас есть строка s =" 1 2 3"

мы можем:

istringstream iss(s);  
int a;
int b;
int c;

iss >> a >> b >> c;

Допустим, у нас есть текстовый файл со следующим:

test1
100 мс

test2
200 мс

test3
300 мс

ifstream in ("test.txt")
string s;
while (getline(in, s))
{
       // I want to store the integers only to a b and c, How ?
}

2 ответа

Если вам известен шаблон деталей в текстовом файле, вы можете проанализировать все детали, но сохранить только значения int. Например:

ifstream in ("test.txt")
string s;
while (getline(in, s))
{
     getline(in,s); //read the line after 'test'.
     string temp;
     istringstream strm(s);
     s >> temp;
     int a = stoi(temp) // assuming you are using C++11. Else, atoi(temp.c_str())
     s >> temp;
     getline(in,s); // for the line with blank space
}

Приведенный выше код по-прежнему не совсем элегантный. Кроме того, вы можете использовать случайные файловые операции в C++. Они позволяют перемещать указатель для чтения данных из файла. Обратитесь к этой ссылке для получения дополнительной информации: http://www.learncpp.com/cpp-tutorial/137-random-file-io/

PS: я не запускал этот код в моей системе, но я думаю, он должен работать. Второй метод работает точно так же, как я использовал его раньше.

1) Вы можете рассчитывать на успешное преобразование в int:

int value;
std::string buffer;
while(std::getline(iss, buffer,' ')) 
{
    if(std::istringstream(buffer) >> value)
    {
        std::cout << value << std::endl;
    }
}

2) или просто пропустите ненужные данные:

int value;
std::string buffer;
while(iss >> buffer) 
{
    iss >> value >> buffer;
    std::cout << value << std::endl;
}
Другие вопросы по тегам