2014-02-12 117 views
1

我可以在我的列表中找到单词,但是我希望在单词找到后显示任何数字。我的名单上有名字,然后是他们的GPA。在C++中查找单词

例...

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; 
    } 
+0

如果每一行都包含名称和GPA,为什么不能简单地打印'line'以便将其全部显示? – 0x499602D2

回答

2

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

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

注意,这不是找到名字的最佳方式。例如,如果用户输入Carl,该怎么办?它将作为字符串Carlos的一部分被发现。或者,如果他们输入2,它将匹配GPA的多个部分。

您可以在这里执行的操作是使用字符串流来读取名称。我们假设它不包含空格,这将使其符合您阅读用户姓名的方式。顺便说一句,您需要包含<sstream>。请注意,您可以将GPA读出为同一机制的一部分。

istringstream iss(line); 
string thisname, gpa; 

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

最后,您可能要考虑在比较字符串时忽略大小写。厚颜无耻的方式是使用旧的C函数。我知道有C++方法这一点,但没有一个是好老stricmp简单从<cstring>

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

我有一个问题,但我想通过gpa作为数字,而不是一个字符串,因为我希望能够在未来操纵他们的gpa。例如加或减.. – Cris

+0

那么,只要将它读作'double'或'float'的值而不是'string'。您可能需要考虑四舍五入错误,就像这些数据类型常见的那样,但是要保持原样。如果您始终使用精确到小数点的位置,则可以使用整数处理这些问题,但我认为这是一个较大的主题,不一定会为此问题增加价值。 – paddy

+0

谢谢澄清! – Cris

0

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

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

你可以,但这不是一个非常可靠的方法。对于规定条目是基于行的数据文件,使用'getline'是一个非常好的主意,然后用字符串流或类似的方法解析出信息。这样,文件中的任何错误都不会导致程序的疯狂行为 – paddy

+0

我看不出如何使用'getline'使它更健壮。 – jaho

+0

如果文件中有一行不包含两个空格分隔的项目,则输入将与文件内容不同步。另外,你没有强调使用'int'作为'gpa'类型的OP问题,或者建议使用不同的类型。如果你使用这个逐字记录,那么第二次循环时名字将被读作'.3',并且GPA输入将失败。 – paddy

2

可以使用字符串流拆分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; 
    } 
}