程序从输入文件中读取文本。我的输出结果是:
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");
}
答案 0 :(得分: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) - 因此您只需从所有级别的第一个数组位置输出星标!我在提供的代码段中解决了这个问题。
答案 1 :(得分: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;
}
您的主要打开输入文件,然后将ifstream
传递给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
// ...
}