C - 使用fstream读取文本文件时的奇怪值

时间:2012-12-10 06:49:13

标签: c++ fstream file-io

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

//main.cpp
void main(){
int T_FileX1[1000]; 
    int *ptr=readFile("x1.txt");

    for(int counter=0; counter<1000; counter++)
        cout<<*(ptr+counter)<<endl;    
}

,功能是:

//mylib.h 
int* readFile(string fileName){
    int index=0;
            ifstream indata;
            int num;

    int T[1000];    
    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[index]=num;       
                indata >> num; // sets EOF flag if no value found
                index++;
            }
            indata.close();

            int *pointer;
            pointer=&T[0];
            return pointer;
}

文件中的数据包含正数,如

5160
11295
472
5385
7140

当我在“readFile(string)”函数中写入每个值时,它写入true。但当我把它写在屏幕上时,U在“主要”功能中写道,它给出了奇怪的价值:

0
2180860
1417566215
2180868
-125634075
2180952
1417567254
1418194248
32   
2180736

与我的数据无关。我的文件中有1000个数字,我想在真正的写作之后,它会激发这些不相关的值。例如。它将前500个值写为true,然后将不相关的值写入我的数据。我的错在哪里?

3 个答案:

答案 0 :(得分:3)

int T[1000]; 
...
pointer=&T[0];

您正在返回一个指向本地堆栈变量的指针,该变量将被破坏。

我认为您要做的是将已定义的数组T_FileX1传递给函数,并直接使用它来读取数据。

答案 1 :(得分:1)

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

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;
}

答案 2 :(得分:0)

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

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