2013-06-20 119 views
0

大家好,我对C++并不陌生,但我的技能并没有被磨练。无论如何,我有一项任务是我无法按时完成的,而且它让我无法让我的代码正常工作。现在我只想完成它,以便我可以知道如何为将来的任务。C++读取.txt文件列到数组

数据文件包含玩家人数及其在同一行上的分数,最后一列是他们的时间。

问题是这样的,有一个.txt文件,我必须在我的程序中打开,读取为(没有项目符号)。

  • 弹出23 45 92 34 43 125
  • COP 4 23 56 23 75 323
  • ...等等。

如何存储/忽略第一个变量,然后用数据列按列(分隔空白)创建数组?

这是我创建的。我创建了需要存储各自数据的数组。

#include <iostream> 
#include <cmath> 
#include <ctime> 
#include <iomanip> 
#include <vector> 
#include <string> 
#include <sstream> 
#include <fstream> 
using namespace std; 

int main() 
{ 
    cout<<"Welcome to the Score Sorting Program! \n"; 
    cout<<"Please choose a number that corresponds with the way you would like to sort. \n"; 
    cout<<"You may also search by player if you know their username. \n"; 

    string players[50]; //Allocated space for 50 players. 
    int score1[27]; //Array for Score 1 
    int score2[27]; // 
    int score3[27]; // 
    int score4[27]; // 
    int score5[27]; // 
    int time[27]; //Array for Time 
    int i = 0; 
    int j = 0; 

    ifstream myfile; 
    myfile.open("G2347M.txt"); 
    if (!myfile) 
    { 
     cout<<"Could not open file. \n"; 
     system ("Pause"); 
     return -1; 
    } 

    while (!myfile.eof()) 
    { 
     getline(myfile, players[i], ' '); 
     if (i == 26) 
     { 
      i=0; 
      ++j; 
      getline(myfile, players[i],' '); 
     } 
     i++; 
    }  

} 

所以基本上我会将玩家与他们的分数对齐并输出到另一个文件。 我只想让这个阅读文件的第一部分,然后我将继续前进。

我研究过类似的话题(4小时+),试图将代码拼凑起来,让我的工作。我会继续研究和更新我所能做的。

+0

我发现有多个线程关于存储第一个数字与向量,但我需要使用数组。 –

+1

为什么玩家阵列是一个整数?它似乎是一个玩家名字的字符串数组。 –

+0

哎呀,是的,只是把它改成了字符串。 –

回答

0

这是一个使用操作符>>的封装和重载的方法。我假设你所描述的输入只是一个由空格分隔的输入值的长序列,第一个值是玩家的数量。

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <sstream> 
#include <fstream> 
#include <ctype.h> 

using namespace std; 

static const size_t MaxNumPlayers = 50; 

// C++ is about encapsulation, and the player data is 
// discrete yet related, so encapsulate it. 
struct Player 
{ 
    string m_name; 
    int m_scores[5]; 
    size_t GetNumScores() const { return sizeof(m_scores)/sizeof(m_scores[0]); } 
    int m_time; 
}; 

// This allows us to write an operator that will read a player 
// directly from an ifstream. 
std::ifstream& operator>>(ifstream& istr, Player& player) 
{ 
    istr >> player.m_name; 
    for(size_t i = 0; i < player.GetNumScores(); ++i) 
    { 
     istr >> player.m_scores[i]; 
    } 
    istr >> player.m_time; 
    cout << "player: " << player.m_name << ", " << player.m_scores[0] << " @ " << player.m_time << endl; 
    return istr; 
} 

int main(int argc, const char** argv) 
{ 
    ifstream myfile("G2347M.txt"); 
    if (!myfile) 
    { 
     cout<<"Could not open file. \n"; 
     system("Pause"); 
     return -1; 
    } 

    // We can read the number of players directly. 
    size_t numPlayers = 0; 
    myfile >> numPlayers; 
    if (numPlayers <= 0 || numPlayers > MaxNumPlayers) { 
     cout << "Invalid number of players in score file ("<<numPlayers<<")." << endl; 
     system("Pause"); 
     return -1; 
    } 

    Player players[MaxNumPlayers]; 
    size_t playersRead = 0; 

    while (!myfile.eof()) 
    { 
     myfile >> players[playersRead++]; 
     if (playersRead >= numPlayers) 
      break; 
     // drain any spaces after the player. 
     while(isspace(myfile.peek())) 
      myfile.ignore(); 
    } 

    if (playersRead != numPlayers) 
    { 
     cout << "Problem reading score file, expected " << numPlayers << " but read " << playersRead << endl; 
     system("Pause"); 
     return -1; 
    } 

    cout<<"Welcome to the Score Sorting Program! I read "<<playersRead<<" players."<<endl; 
    cout<<"Please choose a number that corresponds with the way you would like to sort."<<endl; 
    cout<<"You may also search by player if you know their username.\n"<<endl; 

    /* ... */ 

    system("Pause"); 
    return 0; 
} 
+0

当您在顶部声明MaxNumPlayers时,能否解释size_t的用法?我对那里正在发生的事情有点困惑,但是我发现它在主函数中再次使用,它读取'if(numPlayers <= 0 || numPlayers> MaxNumPlayers){...}' – andrewec

+0

' size_t'是用于保存大小值的相对标准类型。 'static const size_t NumPlayers = 5;'是一个本地范围的常量,换句话说,不是在每个地方都使用'5',我创建了一个有意义的命名值。如果你看到'int x = 32 + 5;'或'int x = 37;'你怎么知道这些数字是什么? 'int x = FirstPlayerNum + NumPlayers'自我解释。 – kfsone

+0

这很有道理 - 但为什么不使用'static const NumPlayers = 5'?我想这就是我被挂断的地方。 – andrewec

0

为什么50名球员只有27分?

我假设第一行是您期望读取的行的总数?如果是这样,你可以动态分配数组来保存所有的数据,而不仅仅是处理50行(或27行)。您也可以将一行的所有数据合并到一个结构中,而不是将它分散到一堆断开的数组中。

伪代码:

int lineNo = 1; 
int totalLines = -1; /* not set */ 

while(line = read_a_line()) { 
    if (lineNo == 1) { 
     totalLines = convert_line_text_to_number(); 
    } 
    else { 
     /* split the line into "tokens" separated by white space */ 
     /* store each token in the correct array */ 
    } 
    lineNo++; 
    /* if lineNo is too big, break the loop */ 
} 
+0

这是27行,但指示说为最多50名玩家分配空间。在该文件中有27. –

0

使用它会用向量的最佳途径。但正如你所说的,你必须使用数组,所以这里是它的代码。

#include <iostream> 
#include <fstream> 
#include <sstream> 

using namespace std; 

int main() 
{ 
    ifstream file; 
    file.open("sample.txt"); 

    string name[50]; 
    int score1[27],score2[27],score3[27],score4[27],score5[27],time[27]; 


    int i = 0; 
    while(!file.eof()) 
    { 
     string line; 
     getline(file,line); 
     char* a = const_cast<char*>(line.c_str()); 
     char* pch = strtok (a," "); 

     name[i] = pch; 
     int counter = 1; 
     while (counter < 7) 
     { 
      pch = strtok (NULL, " "); 

      if(counter == 1) 
      { 
       score1[i] = atoi(pch); 
      } 
      else if(counter == 2) 
      { 
       score2[i] = atoi(pch); 
      } 
      else if(counter == 3) 
      { 
       score3[i] = atoi(pch); 
      } 
      else if(counter == 4) 
      { 
       score4[i] = atoi(pch); 
      } 
      else if(counter == 5) 
      { 
       score5[i] = atoi(pch); 
      } 
      else if(counter == 6) 
      { 
       time[i] = atoi(pch); 
      } 

      ++counter; 
     } 

     ++i; 
    } 

    //cout<<a; 
    return 0; 
} 

如果您遇到任何问题,请让我知道。我没有添加一些基本的完整性检查,例如文件检查,请在您的版本中进行检查。