我有一个C ++程序,我将其中的信息插入到文件中。我得到了第二个(这个)程序来获取数据。我的目标是获取所有数据并将其作为类型为Student的数组返回。在GetFromFile方法中我获取信息并且我可以打印它,但我如何在主函数中返回并使用它:
int size;
Student *students = getFromFile( "D:\\test.txt", size );
cout << students[0].name;
我得到的错误是
[Warning] address of local variable `students' returned
这是我的代码:
struct Student
{
string name;
char egn[11];
short grade;
double avg_grades;
int excused, unexcused;
};
Student* getFromFile(string filename, int &length)
{
fstream file;
file.open(filename.c_str(), ios::in);
file >> length;
Student students[length];
for ( int i = 0; i < length; i++ )
{
file >> students[i].name >> students[i].egn >> students[i].grade >> students[i].avg_grades >> students[i].excused >> students[i].unexcused;
}
file.close();
return students;
}
int main()
{
int size;
Student *students = getFromFile( "D:\\test.txt", size );
cout << students[0].name;
答案 0 :(得分:2)
首先,这个:
file >> length;
Student students[length];
是非标准扩展名。数组的长度应该在编译时知道。
其次,您将返回指向一个数组超出范围后将释放的内存的指针。您应该使用std::vector
代替:
#include <vector>
// ...
std::vector<Student> getFromFile(string filename)
{
// ...
std::vector<Student> students(length);
此外,您不再需要通过引用传递length
,因为std::vector
具有size
成员函数。
答案 1 :(得分:0)
在getFromFile
中,您将返回指向仅存在于该函数中的向量的指针。然后,在main
中,您有一个指向某些无效数据的指针。
在使用数据后,您应该Student *students = new Student[length];
使用getFromFile
,delete [] students;
使用main
。但是像其他人所说的那样使用矢量是一个更好的主意。