0

テキスト ファイルを読み取り、ファイル内の整数値から配列を作成し、その配列の参照を 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 に書き込み、次に無関係な値をデータに書き込みます。私のせいはどこですか?

4

3 に答える 3

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

破壊されるローカルスタック変数へのポインタを返します。

あなたがやりたいのは、T_FileX1定義した配列を関数に渡し、それを直接使用してデータを読み込むことだと思います。

于 2012-12-10T06:55:39.600 に答える
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;
}
于 2012-12-10T06:56:49.453 に答える
0

これは未定義動作の場合です。関数が使用するスタックの一部が無効になったときに、ローカル変数へのポインタを返します。

代わりに、配列を引数として関数に渡します。

于 2012-12-10T06:56:48.993 に答える