c ++来自外部txt文件的排行榜输出不起作用

时间:2017-04-21 02:54:29

标签: c++ c++11 visual-c++

您好我一直在尝试编写一个程序,其中编译器从txt文件中获取分数并按升序输出它们但是它没有任何关于错误的想法吗?我怎么能把它变成一个数组?

这是我正在使用的infile.txt:

1 John Doe     23567
2 Larry Bird       21889
3 Michael Jordan   21889
4 James Bond       13890
5 Gary Smith       10987
6 GJ               9889
7 Vivien vien      8990
8 Samantha Carl    6778
9 Gary  Lewes      5667
10 Sybil Saban     4677

该计划:

#include <iostream>
#include <fstream>
#include <string>
using std::ifstream;
using namespace std;


int main ()
{
    ifstream file_("infile.txt");
    int highscore;
    std::string name;
    int id;
    if (file_.is_open())
    {
    while(file_>>id >> name >> highscore)
    {

        std::cout<<id << " " <<name << " " <<highscore<<"";
    }
    file_.close();

    }


system ("pause");
return 0;

}

2 个答案:

答案 0 :(得分:0)

使用时

file_>> id >> name >> highscore

只读取第一个名称,没有任何内容被读入highscore,流进入错误状态,循环立即中断。

您需要使用:

std::string firstName;
std::string lastNmae;

file_ >> id >> firstName >> lastName >> highscore

<强>更新

存在

6 GJ               9889
文件中的

使得简单阅读文件变得困难。你必须使用完全不同的策略。

  1. 逐行阅读文件。
  2. 标记每一行。
  3. 从第一个令牌中提取ID。
  4. 从最后一个标记中提取高分。
  5. 合并中间代币以形成名称。
  6. 这就是我的想法:

    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <string>
    #include <vector>
    
    using std::ifstream;
    using namespace std;
    
    int main ()
    {
       ifstream file_("infile.txt");
    
       int highscore;
       std::string name;
       int id;
       if (file_.is_open())
       {
          std::string line;
          while ( getline(file_, line) )
          {
             std::string token;
             std::istringstream str(line);
             std::vector<std::string> tokens;
             while ( str >> token )
             {
                tokens.push_back(token);
             }
    
             size_t numTokens = tokens.size();
             if ( numTokens < 2 )
             {
                // Problem
             }
             else
             {
                id = std::stoi(tokens[0]);
                highscore = std::stoi(tokens.back());
    
                name = tokens[1];
                for ( size_t i = 2; i < numTokens-1; ++i )
                {
                   name += " ";
                   name += tokens[i];
                }
    
                std::cout << id << " " << name << " " << highscore << std::endl;
             }
          }
       }
    }
    

答案 1 :(得分:0)

在结构中收集所有这些数据点,并将输入解析为这些结构的数组。

解析输入时,需要注意: 1)如何&gt;&gt;实际上有效 2)指定的输入文件的名称为1和2个单词 3)字符串可以访问+ =运算符,这可能很方便。

完成此操作后,您将需要按其分数成员对此结构数组进行排序,然后按顺序输出数组。