Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从不同函数读取文件_C++_Fstream - Fatal编程技术网

C++ 从不同函数读取文件

C++ 从不同函数读取文件,c++,fstream,C++,Fstream,我试图从另一个函数中读取同一个文件,但它不起作用。 我想问题是我试图从ifstream&input中读取,但我不知道其他实现方法 #include <iostream> #include <fstream> using namespace std; class Student{ public: char name[40]; // i cant use string int age; void Input(ifstream &i

我试图从另一个函数中读取同一个文件,但它不起作用。 我想问题是我试图从
ifstream&input
中读取,但我不知道其他实现方法

#include <iostream>
#include <fstream>

using namespace std;

class Student{
    public:
    char name[40]; // i cant use string
    int age;

    void Input(ifstream &input)
    {
        input.getline(name, 40);
        input >> age;
    }
};

void Read(Student *students, int &numberOfStudents)
{
    ifstream input("test.txt");

    input >> numberOfStudents;

    students = new Student[numberOfStudents];

    for (int i = 0; i < numberOfStudents; ++i)
        students[i].Input(input);

    input.close();
}

int main()
{
    int size = 0;
    Student *students = NULL;

    Read(students, size);

    for (int i = 0; i < size; ++i)
        cout << students[i].name << endl << students[i].age << endl;

    return 0;  
}
(如果程序运行正常,我应该得到1名年龄2等)
但是我得到的是没有年龄分别为1、2、3的名字,因为你定义了:

void Read(Student *students, int &numberOfStudents)
然后

int size = 0;
Student *students = NULL;
Read(students, size);
students
指针由值传递,因此
Read()
无法更改函数外部的内存地址

要解决此问题,只需通过引用传递指针:

void Read(Student *& students, int &numberOfStudents)
最后,正如我所评论的,您需要考虑空白,例如,
'\n'
行结束 使用
>
运算符提取数据时,在文件中:

void Input(ifstream &input)
{
    input.getline(name, 40);
    input >> age;
    input.ignore(1);
}

读取文件中的学生人数也一样。

您不返回指向学生的指针,因此分配仅在本地进行,请返回指针并从返回值中重写
students
。另外:您正在泄漏内存。你能用vector吗?@n314159我忘了写delete。谢谢我不能使用vector(我想使用,但我不能)。我运行了一个小测试,我做了同样的事情(不返回指针),但我的数组仍然更改了值。我还是要试试。感谢使用向量来存储学生对象。更好的方法是:为从istream读取的学生定义构造函数。@JATothrim我不能使用vector为什么不能使用
std::string
std::vector
?我的函数现在返回指针。现在,这部分工作正常。但我只得到3个学生对象,没有名字,年龄=0。主要问题仍在
void Input()
中。感谢您的建议您能链接您试图读取的test.txt文件吗?使用
input>>name工作。问题似乎是您没有正确计算文件中的空白,即换行符。以下数据工作:
void Input(ifstream &input)
{
    input.getline(name, 40);
    input >> age;
    input.ignore(1);
}