C++ C-使用fstream读取文本文件时出现奇怪值

C++ C-使用fstream读取文本文件时出现奇怪值,c++,fstream,file-io,C++,Fstream,File Io,我编写了一个函数来读取一个文本文件,从文件中的整数值创建一个数组,并将该数组的引用返回给main函数。我编写的代码(在VS2010中): 当我在“readFile(string)”函数中写入每个值时,它会写入true。但当我像U在“main”函数中写的那样将其写到屏幕上时,它给出了奇怪的值: 0 2180860 1417566215 2180868 -125634075 2180952 1417567254 1418194248 32 2180736 与我的数据无关。我的文件中有1000

我编写了一个函数来读取一个文本文件,从文件中的整数值创建一个数组,并将该数组的引用返回给main函数。我编写的代码(在VS2010中):

当我在“readFile(string)”函数中写入每个值时,它会写入true。但当我像U在“main”函数中写的那样将其写到屏幕上时,它给出了奇怪的值:

0
2180860
1417566215
2180868
-125634075
2180952
1417567254
1418194248
32   
2180736
与我的数据无关。我的文件中有1000个数字,我猜在一段真实的文字之后,这些不相关的值会被破坏。例如,它先将500个值写入true,然后将不相关的值写入我的数据。我的错在哪里

int T[1000]; 
...
pointer=&T[0];
您将返回一个指向将被销毁的本地堆栈变量的指针

我认为您要做的是将您定义的数组
T_FileX1
传递到函数中,并直接使用该数组将数据读入

您将返回一个指向将被销毁的本地堆栈变量的指针

我认为您要做的是将已定义的数组
T\u FileX1
传递给函数,并直接使用该数组将数据读入。

这是一种未定义行为的情况。当函数返回函数使用的堆栈部分不再有效时,返回指向局部变量的指针

将数组作为参数传递给函数。

这是未定义行为的情况。当函数返回函数使用的堆栈部分不再有效时,返回指向局部变量的指针


将数组作为参数传递给函数。

返回指向数组第一个元素的指针,该元素在堆栈上分配,并在函数返回后被销毁。尝试改用矢量:

vector<int> readFile(string fileName) {
    ifstream indata;
    int num;

    vector<int> T;
    indata.open("fileName");
    if(!indata){
        cerr<<"Error: file could not be opened"<<endl;
        exit(1);
    }
    indata>>num;
    while ( !indata.eof() ) { // keep reading until end-of-file
        T.push_back(num);
        indata >> num; // sets EOF flag if no value found
    }
    indata.close();

    return T;
}
矢量读取文件(字符串文件名){
Iftream indata;
int-num;
向量T;
打开(“文件名”);
如果(!indata){
cerr num;//如果找不到值,则设置EOF标志
}
indata.close();
返回T;
}

返回指向数组第一个元素的指针,该数组在堆栈上分配,并在函数返回后被销毁。尝试改用矢量:

vector<int> readFile(string fileName) {
    ifstream indata;
    int num;

    vector<int> T;
    indata.open("fileName");
    if(!indata){
        cerr<<"Error: file could not be opened"<<endl;
        exit(1);
    }
    indata>>num;
    while ( !indata.eof() ) { // keep reading until end-of-file
        T.push_back(num);
        indata >> num; // sets EOF flag if no value found
    }
    indata.close();

    return T;
}
矢量读取文件(字符串文件名){
Iftream indata;
int-num;
向量T;
打开(“文件名”);
如果(!indata){
cerr num;//如果找不到值,则设置EOF标志
}
indata.close();
返回T;
}

您正在将垃圾读入num。似乎您想要的是解析表示数字的字符串并将其转换为整数。@DiegoBasch。。。。错了!ifstream
操作符>>
根据目标数据类型自动解析数据。
而(!indata.eof())
不正确。在这里阅读关于“EOF反模式”的更多信息:您正在将垃圾读入num。似乎您想要的是解析表示数字的字符串并将其转换为整数。@DiegoBasch。。。。错了!ifstream
操作符>>
根据目标数据类型自动解析数据。
而(!indata.eof())
不正确。在这里阅读更多关于“EOF反模式”的内容:它不会崩溃,因为他只读取堆栈内存并将其作为数字转储到
cout
。所以没有理由崩溃,但堆栈上的信息毫无意义。@MichaelBurr啊,是的,这是有道理的,只有写入才会触发崩溃,对吗?如果您以其他方式使用信息(如指针或索引),读取也可能导致崩溃它不会崩溃,因为他只是读取堆栈内存并将其作为数字转储到
cout
。所以没有理由崩溃,但堆栈上的信息毫无意义。@MichaelBurr啊,是的,这是有道理的,只有写入才会触发崩溃,对吗?如果您以其他方式使用信息(如指针或索引),读取也可能导致崩溃。
int T[1000]; 
...
pointer=&T[0];
vector<int> readFile(string fileName) {
    ifstream indata;
    int num;

    vector<int> T;
    indata.open("fileName");
    if(!indata){
        cerr<<"Error: file could not be opened"<<endl;
        exit(1);
    }
    indata>>num;
    while ( !indata.eof() ) { // keep reading until end-of-file
        T.push_back(num);
        indata >> num; // sets EOF flag if no value found
    }
    indata.close();

    return T;
}