0

该程序从输入文件中读取文本。我的输出应该是:

Level         Score          Stars
----------------------------------
1              3840           **

2              5940           **

3             11560           **

4             18140           **

5             18780           **

星星应该与水平相匹配。

该程序仅显示第一行,但程序已编写,因此循环可以显示总输出。由于某种原因,程序循环只运行第一行代码。

我无法弄清楚为什么程序没有循环多次。任何建议都会有所帮助。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include<fstream>

using namespace std;

int buildArrays(int A[],int B[],int C[])
{
    int i=0,num;
    ifstream inFile;
    inFile.open("candycrush.txt");

    if(inFile.fail())
    {
        cout<<"The candycrush.txt input file did not open"<<endl;
        exit(-1);
    }
    while(inFile)
    {
        inFile>>num;
        A[i]=num;

        inFile>>num;
        B[i]=num;

        inFile>>num;
        C[i]=num;

        i++;
    }
    inFile.close();

    return i;
}

void printArrays( string reportTitle, int levelsArray[], int scoresArray[], int starsArray[], int numberOfLevels )
{
    cout<<endl;
    cout<<reportTitle<<endl;
    cout<<"Levels\tScores\tStars"<<endl;
    cout<<"---------------------"<<endl;

    for(int i=0;i<numberOfLevels;i++)
    {
        cout<<levelsArray[i]<<"\t"<<scoresArray[i]<<"\t";
        for(int j=0;j<starsArray[j];j++)
        {
            cout<<"*";
        }
        cout<<endl;
    }
}

void sortArrays( int levelsArray[], int scoresArray[], int starsArray[], int numberOfLevels )
{
    for(int i=0;i<numberOfLevels;i++)
    {
        for(int j=0;j<numberOfLevels;j++)
        {
            if(levelsArray[i]<levelsArray[j])
            {
                int temp1=levelsArray[i];
                int temp2=scoresArray[i];
                int temp3=starsArray[i];

                levelsArray[i]=levelsArray[j];
                scoresArray[i]=scoresArray[j];
                starsArray[i]=starsArray[j];

                levelsArray[j]=temp1;
                scoresArray[j]=temp2;
                starsArray[j]=temp3;
            }
        }
    }
}


int main()
{
    const int MAX=400;
    int levelsArray[MAX];
    int scoresArray[MAX];
    int starsArray[MAX];

    int numberOfLevels=buildArrays(levelsArray,scoresArray,starsArray);

    printArrays( "Candy Crush UNSORTED Report", levelsArray, scoresArray, starsArray, numberOfLevels );
    sortArrays( levelsArray, scoresArray, starsArray, numberOfLevels);
    printArrays( "Candy Crush SORTED Report", levelsArray, scoresArray, starsArray, numberOfLevels );

    system("pause");
}
4

2 回答 2

0

candycrush.txt您发布的代码工作正常 - 您的文件或文件读取中可能存在一些错误。考虑以下代码段:

#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>

using namespace std;

int buildArrays(int A[], int B[], int C[]){
    int i=0,num;
    for(i=0;i<10;i++){
      A[i] = 10-i;
      B[i] = 10-i;
      C[i] = 10-i;
    }
    return i;
}

void printArrays( string reportTitle, int levelsArray[], int scoresArray[], int starsArray[], int numberOfLevels ){
    cout<<endl;
    cout<<reportTitle<<endl;
    cout<<"Levels\tScores\tStars"<<endl;
    cout<<"---------------------"<<endl;

    for(int i=0;i<numberOfLevels;i++){
        cout<<levelsArray[i]<<"\t"<<scoresArray[i]<<"\t";
        for(int j=0;j<starsArray[j];j++){
            cout<<"*";
        }
        cout<<endl;
    }
}

void sortArrays( int levelsArray[], int scoresArray[], int starsArray[], int numberOfLevels ){
    for(int i=0;i<numberOfLevels;i++){
        for(int j=0;j<numberOfLevels;j++){
            if(levelsArray[i]<levelsArray[j]){
                int temp1=levelsArray[i];
                int temp2=scoresArray[i];
                int temp3=starsArray[i];

                levelsArray[i]=levelsArray[j];
                scoresArray[i]=scoresArray[j];
                starsArray[i]=starsArray[j];

                levelsArray[j]=temp1;
                scoresArray[j]=temp2;
                starsArray[j]=temp3;
            }
        }
    }
}


int main(){
    const int MAX=400;
    int levelsArray[MAX];
    int scoresArray[MAX];
    int starsArray[MAX];
    int numberOfLevels=buildArrays(levelsArray,scoresArray,starsArray);
    printArrays( "Candy Crush UNSORTED Report", levelsArray, scoresArray, starsArray, numberOfLevels );
    sortArrays( levelsArray, scoresArray, starsArray, numberOfLevels);
    printArrays( "Candy Crush SORTED Report", levelsArray, scoresArray, starsArray, numberOfLevels );
    system("pause");
}

这将正确输出:

Candy Crush UNSORTED Report
Levels  Scores  Stars
---------------------
10      10      **********
9       9       *********
8       8       ********
7       7       *******
6       6       ******
5       5       *****
4       4       ****
3       3       ***
2       2       **
1       1       *

Candy Crush SORTED Report
Levels  Scores  Stars
---------------------
1       1       *
2       2       **
3       3       ***
4       4       ****
5       5       *****
6       6       ******
7       7       *******
8       8       ********
9       9       *********
10      10      **********

还要注意一些事情:我删除#include <cstring>并添加了#include <string>- 否则它根本不会编译(至少在我的平台上,win32 和 VS2012)。您的printArrays()函数应该输出starsArray[i]而不是您编写starsArray[j]的(其中 j 始终为 0) - 所以您只是从第一个数组位置输出所有级别的星星!我在提供的代码片段中修复了这个问题。

于 2013-11-11T09:16:11.533 回答
0

您的“candycrush.txt”文件*在第 3 列中包含一个或多个字符,但您正试图将其作为整数读取。这当然是一个错误,因此设置了输入流的错误状态。在此状态下,从此流的后续读取将失败。

解决这个问题非常简单——只需将最后一列作为完整字符串读取。这也将简化您的printArrays操作,因为您不必再​​计算*;照原样打印出来。

这是你buildArrays用实际大小固定的一点,所以它不会溢出:

template <size_t maxsize>
int buildArrays(istream &is, int (&A)[maxsize], 
                             int (&B)[maxsize], 
                             std::string (&C)[maxsize])
{
  assert(is);

  size_t i;
  for(i = 0; i < maxsize && is; ++i)
  {
    is >> A[i] >> B[i] >> C[i];
  }

  return i;
}

您的 main 打开输入文件并只传递ifstreaminto buildArrays

int main()
{
  const int MAX = 400;
  int levelsArray[MAX];
  int scoresArray[MAX];
  string starsArray[MAX];

  ifstream infile("candycrush.txt");
  int numberOfLevels = buildArrays(infile, levelsArray, scoresArray, starsArray);
  // and other stuff
  // ...
}
于 2013-11-11T10:29:20.150 回答