我的名字、姓氏和四个考试成绩的读取功能处于无限循环中,我找不到问题
My read function for a first name, last name, and four test scores is in an infinite loop and I can't find the issue
我正在处理的功能是从一个文件中读入名字、姓氏和四个浮动测试分数。我已经使用 cin 和 cout 运算符检查在 while 循环的第一次迭代中是否正确读取了所有内容。我正在检查以确保名字与 "No" 不同,在这种情况下它是哨兵。我附上了我的阅读功能,但可以轻松附上可能需要的其他信息。
void ReadInput(ifstream &infile, char *First[], char *Last[], float scores[50][5], int &REU, int &CEU)
//Recieves - the input file, array of first names, last names, array of test scores, and rows and columns used
//Task - reads in the names and test scores from a file
//Returns - filled arrays of first and last names and test scores
//cout << "now in ReadInput " << endl;
char *newPtr;
char first[15], last[15];
int i;
float score;
REU = 0;
infile >> ws;
infile.getline(first,15); //read first name from file
while(strcmp(first,"No ") != 0) // read in names and test scores until "No More"
{
newPtr = new char[15];
strcpy(newPtr, first);
First[REU] = newPtr;
infile >> ws;
infile.getline(last,15);
newPtr = new char[15];
strcpy(newPtr, last);
Last[REU] = newPtr;
CEU = 0; //Initialize the columns used for use in the next row
for(i=0; i<4; i++) //loop through each column in file
{
infile >> scores[REU][i]; //read in the test score
}
REU++;
infile >> ws;
infile.getline(first,15);
CEU=i;
}
cout << "Now Leaving Read" << endl;
cin.ignore();
return;
}
OP 在事物的外观上受到一些严格的限制,不允许使用 std::string 或其他类似的有趣工具,使这项任务变得微不足道。可惜。
好的问题:无限循环。
为什么?
两个原因:
所有文件读取都未经检查,因此当文件到达末尾或读取无法转换的浮点数时,文件流将进入并永远处于错误状态,并且可以永远不要阅读 "No\nmore".
的退出条件
误解了 getline 的工作原理并将太长的字符串与垃圾进行比较。
infile.getline(第一个,15);
读取到行的 ned 并在添加空值之前最多存储 14 个字符。如果该行提早结束,则 getline 放置空值。所以No的目标行会把No[=12=]
放到first
while(strcmp(first,"No ") != 0)
将 No[=12=]
与 No [=15=]
进行比较。这些不匹配。
由于这是一项作业,我将只简要介绍解决方案
while(infile.getline(first,15) &&
infile.getline(last,15) &&
read in the rest of the inputs )
{
if (strcmp(first, "No") == 0 &&
strcmp(last, "more") == 0)
{
break;
}
all inputs are good, so process everything
}
我正在处理的功能是从一个文件中读入名字、姓氏和四个浮动测试分数。我已经使用 cin 和 cout 运算符检查在 while 循环的第一次迭代中是否正确读取了所有内容。我正在检查以确保名字与 "No" 不同,在这种情况下它是哨兵。我附上了我的阅读功能,但可以轻松附上可能需要的其他信息。
void ReadInput(ifstream &infile, char *First[], char *Last[], float scores[50][5], int &REU, int &CEU)
//Recieves - the input file, array of first names, last names, array of test scores, and rows and columns used
//Task - reads in the names and test scores from a file
//Returns - filled arrays of first and last names and test scores
//cout << "now in ReadInput " << endl;
char *newPtr;
char first[15], last[15];
int i;
float score;
REU = 0;
infile >> ws;
infile.getline(first,15); //read first name from file
while(strcmp(first,"No ") != 0) // read in names and test scores until "No More"
{
newPtr = new char[15];
strcpy(newPtr, first);
First[REU] = newPtr;
infile >> ws;
infile.getline(last,15);
newPtr = new char[15];
strcpy(newPtr, last);
Last[REU] = newPtr;
CEU = 0; //Initialize the columns used for use in the next row
for(i=0; i<4; i++) //loop through each column in file
{
infile >> scores[REU][i]; //read in the test score
}
REU++;
infile >> ws;
infile.getline(first,15);
CEU=i;
}
cout << "Now Leaving Read" << endl;
cin.ignore();
return;
}
OP 在事物的外观上受到一些严格的限制,不允许使用 std::string 或其他类似的有趣工具,使这项任务变得微不足道。可惜。
好的问题:无限循环。
为什么?
两个原因:
所有文件读取都未经检查,因此当文件到达末尾或读取无法转换的浮点数时,文件流将进入并永远处于错误状态,并且可以永远不要阅读 "No\nmore".
的退出条件
误解了 getline 的工作原理并将太长的字符串与垃圾进行比较。
infile.getline(第一个,15);
读取到行的 ned 并在添加空值之前最多存储 14 个字符。如果该行提早结束,则 getline 放置空值。所以No的目标行会把No[=12=]
放到first
while(strcmp(first,"No ") != 0)
将 No[=12=]
与 No [=15=]
进行比较。这些不匹配。
由于这是一项作业,我将只简要介绍解决方案
while(infile.getline(first,15) &&
infile.getline(last,15) &&
read in the rest of the inputs )
{
if (strcmp(first, "No") == 0 &&
strcmp(last, "more") == 0)
{
break;
}
all inputs are good, so process everything
}