我写了下面一段程序,是从input.txt中读取数据然后存入类数组a中,input.txt 数据如下:
1 wang 14
2 li 20
3 zhang 35
可是a数组的输出如下:
1 zhang 14
2 zhang 20
3 zhang 35
不知道是怎么回事?请指教!谢谢!
#include<fstream.h>
#include<iostream.h>
#include<stdlib.h>
class li{
public:
int id;
char *name;
int age;
};
void main()
{
li a[3];
int id1;
char name1[8];
int age1;
ifstream input;
input.open("input.txt");
for(int j = 0; j < 3; j++)
{
input >> id1;
a[j].id = id1;
input >> name1;
a[j].name = name1;
input >> age1;
a[j].age=age1;
}
for( j = 0; j < 3; j++)
cout << a[j].id << " " << a[j].name << " " << a[j].age << endl;
input.close();
}
自己跟一下没?
a[j].name = name1;
------------------
if ((a[j].name = (char *)malloc(sizeof(char)*(strlen(name1)+1)) != NULL)
strcpy(a[j].name,name1);
#include<fstream.h>
#include<iostream.h>
#include<stdlib.h>
class li{
public:
int id;
char *name;
int age;
};
void main()
{
li a[3];
int id1;
char name1[8];
int age1;
ifstream input;
input.open("input.txt");
for(int j = 0; j < 3; j++)
{
input >> id1;
a[j].id = id1;
input >> name1;
a[j].name = new char[20]; //分配空间
strcpy(a[j].name,name1);
input >> age1;
a[j].age=age1;
}
for( j = 0; j < 3; j++)
cout << a[j].id << " " << a[j].name << " " << a[j].age << endl;
input.close();
}
if ((a[j].name = (char *)malloc(sizeof(char)*(strlen(name1)+1)))!= NULL)
strcpy(a[j].name,name1);
#include<fstream.h>
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
class li{
public:
int id;
char name[8];//注意这里
int age;
};
void main()
{
li a[3];
int id1;
char name1[8];
int age1;
ifstream input;
input.open("d:\\a.txt");
for(int j = 0; j < 3; j++)
{
input >> id1;
a[j].id = id1;
input >> name1;
strcpy(a[j].name,name1);
input >> age1;
a[j].age=age1;
}
for( j = 0; j < 3; j++)
cout << a[j].id << " " << a[j].name << " " << a[j].age << endl;
input.close();
}
input >> name1;
a[j].name = name1;
-------------------------
because all three as names point to the same memory:namel, and its value is the last name you read in.
you would do like this:
#include<fstream>
#include<iostream>
#include<stdlib.h>
using namespace std;
class li{
public:
int id;
char name[8];
int age;
};
void main()
{
li a[3];
int id1;
char name1[8];
int age1;
ifstream input;
input.open("input.txt");
for(int j = 0; j < 3; j++)
{
input >> id1;
a[j].id = id1;
input >> name1;
strcpy(a[j].name,name1);
input >> age1;
a[j].age=age1;
}
for( j = 0; j < 3; j++)
cout << a[j].id << " " << a[j].name << " " << a[j].age << endl;
input.close();
int stop;
cin>>stop;
}
好像都改的差不多了。。
你令3个对象的name成员指针都指向name1,最后一次读入name1的是zhang,所以都是zhang了。
可以作为一个例子载入教科书,描述C指针操作的误区
if ((a[j].name = (char *)malloc(sizeof(char)*(strlen(name1)+1)) != NULL)
strcpy(a[j].name,name1);
这段比较好。呵。
if ((a[j].name = (char *)malloc(sizeof(char)*(strlen(name1)+1)) != NULL)
strcpy(a[j].name,name1);
这段比较好。呵。
=====================================================
其实可读性较差,属于不好代码
1。ifstream 流是按照空格或者你可以指定的分割付来分割数据流的,所以没必要用循环,用while就可以了。
2。类中的name 只是一个指针,定义成数组或者自己new空间。