如何逐行读取,分割字符串

时间:2019-03-26 17:03:47

标签: c++

我希望能够逐行浏览此文本文件并抓取其中的一部分。例如,

Albert, Fred
4541231234
8888 Avenue Drive

Doe, John
6191231234
1234 State Street

Smith, Mike
8791231234
0987 Drive Avenue

我需要抓住阿尔伯特并将其存储为姓氏。 Fred为名字(不包括“,”以及电话号码和地址。

搜索线程后,我发现了一些帮助,这就是我所拥有的。

void AddressBook::readFile(Contact * phoneBook[])
{

    std::string line, line1, line2, line3, line4;
    std::ifstream myFile("fileName.txt");
    std::string name, fName, lName, phoneNumber, address;

    if (!myFile.is_open())
    {
        std::cout << "File failed to open." << std::endl;
        return;
    }

    while (true)
    {
        if (!getline(myFile, line1)) 
        {
            break;
        }

        if (!getline(myFile, line2)) //need to parse into lName and fName
        {
            break;
        }

        if (!getline(myFile, line3))
        {
            break;
        }

        if (!getline(myFile, line4))
        {
            break;
        }

        addContact(line1, line2, line3, line4);
    }
}

如您所见,此代码仅捕获整行。如何在逗号处停下来,将其存储到姓氏变量中,然后继续使用名字?

3 个答案:

答案 0 :(得分:1)

我认为您可以使用substr函数,

line2_1 = line2.substr(0, line2.find(','))
line2_2 = line2.substr(line2.find(',')+2, line2.length())

+2是因为您有一个逗号(+1)和一个在逗号后的空格(+1)。

答案 1 :(得分:1)

std::getline has an overload with a third parameter,可让您将流分割为希望使用的任何字符,而不是行尾。因此,您将line1用作std::istringstream的基础

std::istringstream strm(line1);

然后您就可以

std::getline(strm, lastname, ','); 

在流中留下一个空格,然后是名字,忽略空格,并在流末尾获取行以获取名字。

总的来说,应该看起来像

std::istringstream strm(line1);
std::getline(strm, lastname, ','); 
strm.ignore();
std::getline(strm, firstname); 

答案 2 :(得分:1)

您缺少delimiter

  

从is中提取字符并将它们存储到str中,直到找到定界字符delim(或(2)的换行符'\ n')。

getline()在C ++中已重载,因此您可以按原样使用它,也可以像这样使用它:

getline(myFile, line1,',')

这将告诉getline使用换行符作为分隔符,而不是空格。