从文件读取后,输出中的额外零行

Extra lines of zeros in output after reading from a file

本文关键字:零行 读取 文件 输出      更新时间:2023-10-16

我是试图学习C 的初学者程序员。我正在尝试从文件中读取以下信息:

院长decono 88 98 99
Sally Johnson 78 89 82
Bill Benny 75 79 81
托马斯·波洛斯78 84 89

但是,我得到以下输出,我无法弄清楚为什么:

院长decono 88 98 99
0 0 0
Sally Johnson 78 89 82
0 0 0

这是代码:

#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;
const int NAMESIZE = 15;
const int MAXRECORDS = 50;
struct Grades                             // declares a structure
{
    char name[NAMESIZE + 1];
    int test1;
    int test2;
    int final;
};
typedef Grades gradeType[MAXRECORDS];    
 // This makes gradeType a data type
 // that holds MAXRECORDS
 // Grades structures.
void readIt(ifstream&, gradeType, const int);
int main()
{    
     ifstream indata;
     indata.open("graderoll.dat");
     int numRecord = 4;                
     gradeType studentRecord; 
     if(!indata)
     {
        cout << "Error opening file. n";
        cout << "It may not exist where indicated" << endl;
        return 1;
     }
    readIt(indata, studentRecord, MAXRECORDS); 
    // output the information 
        for (int count = 0; count < numRecord; count++)
    {
           cout << studentRecord[count].name << setw(10) 
            << studentRecord[count].test1
            << setw(10) << studentRecord[count].test2;
           cout << setw(10) << studentRecord[count].final << endl;
    }                
    return 0;
}
void readIt(ifstream& inData, gradeType gradeRec, const int max)
{
   int total = 0;
   inData.get(gradeRec[total].name, NAMESIZE);
   while (inData)
   {
     inData >> gradeRec[total].test1;
     inData >> gradeRec[total].test2;
     inData >> gradeRec[total].final;
     total++;    
     inData.clear(); 
     inData.get(gradeRec[total].name, NAMESIZE);

  }
}

有什么建议可以帮助我解决这个问题?

我解决了问题:

void readIt(ifstream& inData, gradeType gradeRec, const int max)
{
   int total = 0;
   inData.get(gradeRec[total].name, NAMESIZE);
   while (inData)
   {
     inData >> gradeRec[total].test1;
     inData >> gradeRec[total].test2;
     inData >> gradeRec[total].final;
     total++;    
     inData.ignore(NAMESIZE, 'n');
     inData.get(gradeRec[total].name, NAMESIZE);

  }
}

indata.ignore(nameize,' n'); 将使字符数组正常工作。这是因为字符阵列仅限于15个字符。因此,如果指定要忽略接下来的15个字符,或者直到遇到NewLine逃生序列为止,则文件的每一行都正确地读取。

问题是您的使用:

while (inData)

将iostream转换为布尔值时,布尔值反映了eof国旗的状态。但是,直到之后您尝试从文件末尾读取数据。

因此,发生的事情是您的代码成功读取文件的最后一行,然后循环循环且尚未设置EOF标志,并尝试从文件中读取一个 More 行。这不会读取任何实际数据,您会得到零。之后,设置了EOF标志,您的循环终止。

解决此操作的一种方法可能是在阅读预期数据之后测试EOF flag ,因此:

   while (true)
   {
     inData >> gradeRec[total].test1;
     inData >> gradeRec[total].test2;
     inData >> gradeRec[total].final;
     if (!inData) {
       break;
     }
     total++;    
     inData.clear(); 
     inData.get(gradeRec[total].name, NAMESIZE);
   }

您也可以重新安排循环,以便您没有代码两次读取名称,一次末端一次。