【问题标题】:Read elements from a txt file that are separeted by a character从 txt 文件中读取以字符分隔的元素
【发布时间】:2020-10-13 00:16:41
【问题描述】:

我正在开发一个程序,文件中有名字、姓氏和数字,我需要将这些信息读入我的程序。我的实际问题是有些人没有第二个名字或第二个姓氏。为了解决这个问题,我开始尝试从文件中读取,直到找到特定字符,例如:

Robert, Ford Black,208   //Where Robert is the first name, and Ford Black are his two last names
George Richard, Bradford,508 //Where George Richard are both his first names, and Bradford is his only last 
                      name

我将此信息保存在三个分隔的字符串中,一个将存储名字和第二个名字,第一个和第二个姓氏,第三个用于数字。

我正在尝试仅使用来自 c++ 的本机库。 我一直在阅读 getline(a,b,c) 和 IStringStream 实际上可以解决我的问题,但我不知道如何正确实现它

【问题讨论】:

    标签: c++ file getline stringstream


    【解决方案1】:
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        ifstream myfile("files.txt");
        string fullname;
        while(getline(myfile,fullname,'/')) break; //here im reading till the first / is acquired and the entire string is stored in "fullname"
        string firstname,lastname;
        size_t pos=fullname.find(',');
        firstname=fullname.substr(0,pos); //store the firstname
        lastname=fullname.substr(pos+1);// storee the lastname
        cout<<firstname<<" "<<lastname;
    
    }
    

    由于提出的问题是读取我在数字之前假设的名称,如果有“/”,您可以读取到 / 的第一次出现。这会给你全名。然后在全名上使用 substr 并查找逗号是否存在(如果存在的话)。逗号左侧的所有字符将构成您的名字,而逗号位置右侧的其余字符将构成姓氏。

    【讨论】:

    • 虽然这段代码可以解决问题,包括解释如何以及为什么解决问题,这确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。考虑编辑您的答案以添加解释和/或更多关于为什么您的解决方案比其他解决方案更好的见解。见how to answer
    • 因为提出的问题是读取清楚地跟在“//”后面的名称,所以您可以读取到 / 的第一次出现。这会给你全名。然后在全名上使用 substr 并查找逗号是否存在(如果存在的话)。逗号左侧的所有字符将构成您的名字,而逗号位置右侧的其余字符将构成姓氏。
    【解决方案2】:

    只需使用带有分隔符的std::getline 来读取字符串流。请参阅下面的简化示例(无错误检查):

    for (std::string line; std::getline(std::cin, line); )
    {
        std::string firstName, lastName;
        std::istringstream iss(line);
        std::getline(iss, firstName, ',');  // A comma delimits end-of-input
        iss >> std::ws;                     // Skip over any whitespace characters
        std::getline(iss, lastName);        // Read remaining line
        std::cout << "First Name: " << firstName << std::endl;
        std::cout << "Last Name: " << lastName << std::endl;
    }
    

    注意iss &gt;&gt; std::ws; 使用std::ws 来自&lt;iomanip&gt; 的行会占用额外的空白字符(在您的示例中出现在逗号之后)。

    我假设输入中的 C++ 行 cmets 只是这个问题的注释,而不是实际输入的一部分。

    【讨论】:

    • 抱歉,我在文件管理方面有点新手。您正在使用 getline 从行首到第一个 ',' 即看到,然后从那个 ',' 到行尾。那是对的吗?此外,我正在尝试在 while(getline(reader,line)) 循环内的演示代码中实现它,其中 reader 是我的 ifstream 变量,但尚未成功。非常感谢您的回答!
    • 没错。您的 while 循环与我的循环基本相同。它只是从某处读取一行。究竟在哪里并不是重点。你是说你不明白如何让它适应你的程序?
    • 哦,我现在明白了。非常感谢稻田,这实际上就像手套一样适合我遇到的问题!
    • 不客气。我注意到您在问题中添加了更多内容,并且我相信您可以轻松扩展此方法以继续阅读更多内容,而不会真正添加代码混乱。
    • 是的,我在一些论坛上一直在寻找如何解决这类问题,但我从来没有像你那样使用 getline 从 A 点到 B 点。我在问题中添加了更多信息,以防其他人正在寻求解决类似问题可以找到这篇文章。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多