我正在尝试将.txt文件读入此程序中的struct数组并显示内容 该文件如下所示:
Smith Jack 60 45 98
Harry Hisk 45 40 78
Kay Jacob 35.5 23 45
Dos hed 23 20 35
Noa Tom 55 12 32
Joe Peni 57 49 78
Vin San 25.6 23 65.5
Jes Dan 24.3 12 78
Zi Lee 56 49 99
Angi Dev 57 48 97
Donald David 60 50 96
Davis Lal 47 47 80
Alvis Sen 56 46 85
Jack Jill 45 45 75
Messy Lionel 60 49 100
我正在运行的代码:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main(){
const int SIZE=50;
int i;
struct Records {
string firstname;
string secondname;
float test1mark;
float midtestmark;
float annualmark;
}record[SIZE];
ifstream in("Data.txt");
if (!in){
cerr << "File can't be opened! " << endl;
system("PAUSE");
exit(1);
}
for (int i=0; i < SIZE; i++){
in >> record[i].firstname >> record[i].secondname
>>record[i].test1mark >> record[i].midtestmark >> record[i].annualmark ;
}
for (int i=0;i< SIZE;i++) {
cout << record[i].firstname<<" ";
cout << record[i].secondname<<" ";
cout << record[i].test1mark<<" ";
cout << record[i].midtestmark << " ";
cout << record[i].annualmark << " ";
}
return 0;
}
我得到的输出:
Smith Jack 60 45 98
Harry Hisk 45 40 78
Kay Jacob 35.5 23 45
Dos hed 23 20 35
Noa Tom 55 12 32
Joe Peni 57 49 78
Vin San 25.6 23 65.5
Jes Dan 24.3 12 78
Zi Lee 56 49 99
Angi Dev 57 48 97
Donald David 60 50 96
Davis Lal 47 47 80
Alvis Sen 56 46 85
Jack Jill 45 45 75
Messy Lionel 60 49 100
nan 0 8.94237e-039
4.36192e-039 0 -2.3511e-038
0 0 -2.3511e-038
0 0 0
1.32253e-038 0 1.32251e-038
4.2039e-045 0 -2.11122e+037
1.32251e-038 0 3.21276e-039
1.4013e-045 0 -2.3511e-038
1.4013e-045 0 3.76158e-037
0 0 3.76158e-037
0 0 1.12104e-044
4.36195e-039 0 4.36194e-039
3.57331e-043 0 6.0615e-039
0 0 3.21276e-039
4.2039e-045 0 6.41272e-039
1.12104e-044 0 6.63812e-039
4.36205e-039 0 -2.75237e+038
0 0 6.59812e-039
6.63426e-039 0 1.4013e-045
0 0 6.47961e-039
3.21319e-039 0 3.21319e-039
6.59812e-039 0 3.21299e-039
8.40779e-045 2.24208e-044 6.01433e-039
6.6045e-039 0 2.54408e-029
0 0 6.6045e-039
0 0 6.43946e-039
5.88656e-039 0 -4.12495e+011
0 0 0
5.88656e-039 0 2.54408e-029
nan nan 6.43029e-039
0 0 0
5.93823e-039 0 -4.12495e+011
0 0 0
5.93823e-039 0 5.74532e-044
nan nan 5.93837e-039
过程在0.05447秒后退出,返回值为0
按任意键继续 。 。 。
有人可以告诉我它有什么问题吗?我尝试过使用指针,但情况变得更糟。 -Beginner
答案 0 :(得分:1)
您的文件有15
行,因此您只能读取15行数据。您正在使用变量SIZE
来控制应读取的行数。
问题是SIZE
是50
!它是不 15
。当您尝试读取文件末尾时,输入将不读取超过16 th 行。因此,索引15
之后的变量将是未初始化的,即未定义。
将文件中的行数增加到50
,或将SIZE
更改为15
。
答案 1 :(得分:0)
正如@ Rackete1111的另一个答案所述,您指定了太多项目,并且您的循环读取数据超过了文件中的实际项目数。
话虽如此,只要你正确地写出读取循环,就没有任何错误(除了浪费空间,如果你假设你的数组太大),夸大你有多少条记录。以下是编写循环的方法,即使你犯了&#34;错误&#34;陈述50项而不是15:
#include <iostream>
#include <string>
#include <iostream>
using namespace std;
int main(){
const int SIZE=50;
int i;
struct Records {
string firstname;
string secondname;
float test1mark;
float midtestmark;
float annualmark;
};
Records record[SIZE];
ifstream in("Data.txt");
int recCount = 0; // keep track of actual number of records
// loop until we reach the end of file, or until we hit SIZE records,
// whichever comes first
while (!in.eof() && recCount < SIZE)
{
in >> record[recCount].firstname >> record[recCount].secondname
>>record[recCount].test1mark >> record[recCount].midtestmark >> record[recCount].annualmark ;
++recCount;
}
// now recCount == 15 if you have 15 items.
注意我们有一个while
循环,直到达到限制(50),或者我们点击文件结尾。
答案 2 :(得分:-1)
而且我相信我们并不需要
int i;
开头
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
ifstream in("Data.txt");
const int SIZE = 15;
void debugPrint();
void loadData();
struct Records {
string firstname;
string secondname;
float test1mark;
float midtestmark;
float annualmark;
}record[SIZE];
int main()
{
loadData();
debugPrint();
}
void debugPrint()
{
for (int i = 0; i < SIZE; i++)
{
cout << record[i].firstname << " ";
cout << record[i].secondname << " ";
cout << record[i].test1mark << " ";
cout << record[i].midtestmark << " ";
cout << record[i].annualmark << " " <<endl;
}
system("PAUSE");
}
void loadData()
{
for (int i = 0; i < SIZE; i++)
{
if (!in)
{
cerr << "File can't be opened! " << endl;
system("PAUSE");
}
in >> record[i].firstname >> record[i].secondname
>> record[i].test1mark >> record[i].midtestmark >> record[i].annualmark;
}
}