从具有任意数量空格的文件中获取数据集

时间:2012-12-07 08:37:45

标签: c++ ofstream

**请不要直接回答或代码示例,这是我需要学习的功课。我正在寻找有关我需要开发的算法的帮助。

我似乎在为我的班级工作的一部分提出解决方案时遇到逻辑错误,该程序涉及多个文件,但这是唯一相关的部分:

我有一个文件PlayerStats,用于保存篮球运动员的统计数据:

  • 篮板
  • 协助
  • 制服#

我最初的反应是创建一个while循环并将它们读入一个包含这些值的临时结构,然后创建一个合并函数,将temp结构的值与inital数组记录合并,这很简单吗?

struct Baller
{
   //other information on baller
   int rebounds;
   int assists;
   int uniform;
   int points;
   void merge(Baller tmp); //merge the data with the array of records
}

//in my read function..
Baller tmp; 
int j = 0;
inFile << tmp.uniform << tmp.assists << tmp.points << tmp.rebounds
while(inFile){
    ArrayRecords[j].merge(tmp);
    j++;
    //read in from infile again
}

捕获: 该文件可以在标识符之间具有任意数量的空格,并且信息可以是任何顺序(省略统一编号,始终是第一个)。 e.g。

PlayerStats可能是

11 p3 a12 r5 //uniform 11, 3 points 12 assists 5 rebounds
//other info

OR

   11 p    3 r  5  a      12 //same exact values

我想出了什么


似乎无法想到一个算法以正确的顺序从文件中获取这些值,我正在考虑以下几点:

inFile << tmp.uniform; //uniform is ALWAYS first
getline(inFile,str);  //get the remaining line
int i = 0;
while(str[i] == " ") //keep going until i find something that isnt space
    i++;

if(str[i] == 'p')  //heres where i get stuck, how do i find that number now?

else if(str[i] == 'a')

eles if(str[i] = 'r'

2 个答案:

答案 0 :(得分:1)

做类似的事情:

int readNumber () {
  while isdigit (nextchar) -> collect in numberstring or directly build number
  return that number;
}
lineEater () {
  Read line
  skip over spaces
  uniform=readNumber ();
  haveNum=false;
  haveWhat=false;
  Loop until eol {
    skip over spaces
    if (isdigit)
      number=readNumber ();
      skip over spaces
      haveNum=true;
    else 
      char=nextChar;
      haveWhat=true;
    if (haveChar and haveNum) {
      switch (char) {
        case 'p' : points=number; break;
        ...
      }
      haveNum=false;
      haveWhat=false;
    }
  }

或者,如果你更有野心,请为你的输入写一个语法并使用lex / yacc。

答案 1 :(得分:1)

如果您只打算检查一个字母,则可以使用switch语句代替if / else,这样可以更方便地阅读。

你知道那个数字从哪里开始,(提示:str[i+1]),所以根据str[]的类型,你可以使用atoi,如果它是一个char数组,或std::stringstream如果是std::string

我很想给你一些代码,但你也没说。如果你确实想要一些,请告诉我,我会用一些代码编辑答案。

不要使用“合并”功能,而是尝试使用std::vector,这样您就可以push_back结构,而不是进行任何“合并”。此外,你的merge函数基本上是一个copy assignment operator,默认情况下由编译器创建(你不需要创建'merge'函数),你只需要使用=来复制数据跨越。如果你想在'merge'函数中做一些特别的事情,那么你应该overload the copy assignment operator而不是'merge'函数。 Simples