【问题标题】:Finding a word in C++在 C++ 中查找单词
【发布时间】:2014-03-10 03:17:19
【问题描述】:

我能够在我的列表中找到该单词,但我想显示找到该单词后的任何数字。我的名单上有名字,后面跟着他们的 GPA。

示例...

michael 2.3

Rachel 2.5

Carlos 3.0

我想添加在找到名称后显示数字的功能,我声明为 int GPA 但我不确定如何将其合并到我的程序中。

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    string name;
    int offset;
    string line;
    int gpa;

    ifstream read_file;
    read_file.open("alpha.dat");
    cout << "Please enter your name: \n";
    cin >> name;

    if (read_file.is_open())
    {
        while (!read_file.eof())
        {
            getline(read_file, line);
            if ((offset = line.find(name)) != string::npos)
            {
                cout << "the word has been found: \n";
                // cout << name << gpa; example to display
            }
        }
        read_file.close();
        return 0;
    }

【问题讨论】:

  • 如果每一行都包含名称和GPA,为什么不能简单地打印line,以便完整显示?

标签: c++ file while-loop


【解决方案1】:

您可以使用字符串流拆分line,并将其存储到向量中,如下所示:

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
    string name;
    int offset;
    string line;
    int gpa;

    ifstream read_file;
    read_file.open("alpha.dat");
    cout << "Please enter your name: \n";
    cin >> name;

    if (read_file.is_open())
    {
        while (!read_file.eof())
        {
            getline(read_file, line);
            if ((offset = line.find(name)) != string::npos)
            {
                cout << "the word has been found: \n";
                stringstream iss(line);
                vector<string> tokens;

                string str;

                while (iss >> str)
                    tokens.push_back(str);

                cout << tokens[0] << tokens[1];

            }
        }
        read_file.close();
        return 0;
    }
}

【讨论】:

    【解决方案2】:

    据我所知,您只需输出从文件中读取的行:

    while( getline(read_file, line) )
    {
        if ((offset = line.find(name)) != string::npos) cout << line << endl;
    }
    

    请注意,这不是查找名称的最佳方法。例如,如果用户输入Carl 会怎样?它将作为字符串Carlos 的一部分找到。或者实际上,如果他们输入2,它将匹配多人的部分 GPA。

    您可以在这里做的是使用字符串流来读取名称。假设它不包含空格,这将使其符合您读取用户名的方式。顺便说一下,您需要包含&lt;sstream&gt;。请注意,您可以读出 GPA 作为同一机制的一部分。

    istringstream iss( line );
    string thisname, gpa;
    
    if( iss >> thisname >> gpa ) {
        if( thisname == name ) cout << name << " " << gpa << endl;
    }
    

    最后,您可能需要考虑在比较字符串时忽略大小写。厚颜无耻的方法是为此使用旧的 C 函数。我知道有这方面的 C++ 方法,但没有一个像来自 &lt;cstring&gt; 的古老的 stricmp 一样简单:

    if( 0 == stricmp(thisname.c_str(), name.c_str()) ) {
        cout << name << " " << gpa << endl;
    }
    

    【讨论】:

    • 我有一个问题,但我想将 gpa 作为数字而不是字符串传递,因为我希望将来能够操纵他们的 gpa。例如加或减..
    • 好吧,只需将其读取为doublefloat 值而不是string。您可能需要考虑舍入误差,这在这些数据类型中很常见,但请顺其自然。有一些方法可以使用整数来处理这些问题,如果你一直只使用一位小数,但我认为这是一个更大的话题,不一定会为这个问题增加价值。
    • 感谢您的澄清!
    【解决方案3】:

    您可以将getline(read_file, line)... 替换为:

    read_file >> name >> gpa;
    if (name == search_name)
        cout << name << " " << gpa << endl;
    

    【讨论】:

    • 你可以,但这不是一个非常健壮的方法。对于规定条目是基于行的数据文件,最好使用getline,然后使用字符串流或类似的方式解析出信息。这样,文件中的任何错误都不会导致程序的疯狂行为
    • 我看不出使用getline 是如何使它更加健壮的。
    • 如果文件有一行不包含两个空格分隔的项目,输入将与文件内容不同步。此外,您没有针对gpa 的类型强调使用int 的OP 问题,或建议不同的类型。如果你逐字使用,那么第二次循环时,名称将被读取为.3,并且 GPA 输入将失败。
    猜你喜欢
    • 2013-09-20
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多