我的名字、姓氏和四个考试成绩的读取功能处于无限循环中,我找不到问题

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 或其他类似的有趣工具,使这项任务变得微不足道。可惜。

好的问题:无限循环。

为什么?

两个原因:

  1. 所有文件读取都未经检查,因此当文件到达末尾或读取无法转换的浮点数时,文件流将进入并永远处于错误状态,并且可以永远不要阅读 "No\nmore".

  2. 的退出条件
  3. 误解了 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
}