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;
}