将文件读入struct c++数组
Reading file into array of struct c++
我正在尝试将 .txt 文件读入此程序中的结构数组并显示内容。
该文件如下所示:
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 秒后退出,return 值为 0
按任意键继续 。 . .
有人能告诉我它有什么问题吗?我试过使用指针,但情况变得更糟。 -初学者
您的文件有 15
行,因此您只能读取 15 行数据。您正在使用变量 SIZE
来控制应该读取多少行。
问题是SIZE
是50
!是不是15
。当您尝试读取超过文件末尾时,输入将 not 读取超过第 16th 行。所以,索引15
之后的变量将是未初始化的,即undefined.
将文件中的行数增加到 50
,或将 SIZE
更改为 15
。
正如@Rackete1111 的另一个回答所述,您指定了太多项目,并且让读取数据的循环遍历了文件中的实际项目数。
话虽如此,只要您正确编写读取循环,夸大您拥有的记录数确实没有任何问题(除了浪费 space 如果您将数组的大小设置得太大)。以下是编写循环的方法,即使您使用 "mistake" 表示 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),或者到达文件末尾。
而且我相信我们不需要那个
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;
}
}
我正在尝试将 .txt 文件读入此程序中的结构数组并显示内容。
该文件如下所示:
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 秒后退出,return 值为 0
按任意键继续 。 . .
有人能告诉我它有什么问题吗?我试过使用指针,但情况变得更糟。 -初学者
您的文件有 15
行,因此您只能读取 15 行数据。您正在使用变量 SIZE
来控制应该读取多少行。
问题是SIZE
是50
!是不是15
。当您尝试读取超过文件末尾时,输入将 not 读取超过第 16th 行。所以,索引15
之后的变量将是未初始化的,即undefined.
将文件中的行数增加到 50
,或将 SIZE
更改为 15
。
正如@Rackete1111 的另一个回答所述,您指定了太多项目,并且让读取数据的循环遍历了文件中的实际项目数。
话虽如此,只要您正确编写读取循环,夸大您拥有的记录数确实没有任何问题(除了浪费 space 如果您将数组的大小设置得太大)。以下是编写循环的方法,即使您使用 "mistake" 表示 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),或者到达文件末尾。
而且我相信我们不需要那个
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;
}
}