Меня попросили обновить мой код, который читает в текстовом файле и анализирует его для определенных строк.
По сути, вместо того, чтобы открывать текстовый файл каждый раз, я хочу прочитать текстовый файл в память и сохранить его на время объекта.
Мне было интересно, есть ли подобная функция для getline (), которую я мог бы использовать для std :: string, как я могу для std :: ifstream.
Я понимаю, что мог бы просто использовать цикл while / for, но мне любопытно, есть ли другой способ. Вот что я сейчас делаю:
file.txt: (\ n представляет новую строку)
Мой код:
ifstream file("/tmp/file.txt");
int argIndex = 0;
std::string arg,line,substring,whatIneed1,whatIneed2;
if(file)
{
while(std::getline(file,line))
{
if(line.find("3421",0) != string::npos)
{
std::getline(file,line);
std::getline(file,line);
std::stringstream ss1(line);
std::getline(file,line);
std::stringstream ss2(line);
while( ss1 >> arg)
{
if( argIndex==0)
{
whatIneed1 = arg;
}
argIndex++;
}
argIndex=0;
while( ss2 >> arg)
{
if( argIndex==0)
{
whatIneed2 = arg;
}
argIndex++;
}
argIndex=0;
}
}
}
Где в конце whatIneed1 == «whatIneed1» и whatIneed2 == «whatIneed2».
Есть ли способ сделать это с сохранением file.txt в std :: string вместо std :: ifstream asnd с использованием функции, подобной getline ()? Мне нравится getline (), потому что он делает получение следующей строки файла намного проще.
Если вы уже прочитали данные в строку, вы можете использовать std::stringstream
превратить его в файлоподобный объект, совместимый с getline
,
std::stringstream ss;
ss.str(file_contents_str);
std::string line;
while (std::getline(ss, line))
// ...
Вместо того, чтобы взять строку, затем попытаться извлечь из нее одну вещь, почему бы не извлечь одну вещь, а затем отбросить строку?
std::string whatIneed1, whatIneed2, ignored;
if(ifstream file("/tmp/file.txt"))
{
for(std::string line; std::getline(file,line);)
{
if(line.find("3421",0) != string::npos)
{
std::getline(file, ignored);
file >> whatIneed1;
std::getline(file, ignored);
file >> whatIneed2;
std::getline(file, ignored);
}
}
}