从文件读取后,输出中的额外零行
Extra lines of zeros in output after reading from a file
我是试图学习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);
}
您也可以重新安排循环,以便您没有代码两次读取名称,一次末端一次。
相关文章:
- 使用新行和不使用新行读取文件
- 如何在c++中从文本文件中逐行读取整数
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 如何将文本文件的特定行读取到 int 类型的数组中C++?
- 使用 QT 逐行读取 JSON
- 串行读取更改输入,不读取整行
- 逐行读取文件,并将数据插入变量和数组中
- 我遇到使用 c++ 逐行读取输入文件的问题
- 无法逐行读取.csv文件
- 在 c++ 中逐行读取文件(将代码从 Python 转换为 C++)
- 如何从文件中的特定行读取 (C++)
- 如何将文件逐行读取到矢量中,然后打印矢量
- C++逐行读取文件
- 如何将带有不定条目的行读取到数字数组中?
- 如何逐行读取文件并分隔行组件?
- 串行读取()不会在没有数据接收的情况下返回值
- Arduino 到 C++ 串行读取胡言乱语
- 使用"IF" C++逐行读取文本文件
- 使用字符串流逐行读取文件两次
- 从文件读取后,输出中的额外零行