Чтение файла в память C ++: есть ли getline () для std :: strings - PullRequest
0 голосов
/ 08 ноября 2018

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

По сути, вместо того, чтобы открывать текстовый файл каждый раз, я хочу прочитать текстовый файл в память и сохранить его на время действия объекта.

Мне было интересно, существует ли подобная функция для getline (), которую я мог бы использовать для std :: string, как я могу для std :: ifstream.

Я понимаю, что мог бы просто использовать цикл while / for, но мне любопытно, есть ли другой способ. Вот что я сейчас делаю:

file.txt: (\ n представляет новую строку)

file.txt

Мой код:

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 вместо asd std :: ifstream с использованием функции, подобной getline ()? Мне нравится getline (), потому что он значительно облегчает получение следующей строки файла.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вместо того, чтобы взять строку, затем попытаться извлечь из нее одну вещь, почему бы не извлечь одну вещь, а затем отбросить строку?

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);
        }
    }
}
0 голосов
/ 08 ноября 2018

Если вы уже прочитали данные в строку, вы можете использовать std::stringstream, чтобы превратить их в файлоподобный объект, совместимый с getline.

std::stringstream ss;
ss.str(file_contents_str);
std::string line;
while (std::getline(ss, line))
    // ...
...