2010-03-19 68 views
2

我正在嘗試編寫一個簡短的函數,該函數可以讓我快速讀取未知大小的文件,並返回指向數組數組和數組長度的指針,但似乎我的代碼不起作用。我究竟做錯了什麼?使用函數讀取長度未知的文件

int readIn(int* pointer, param parameters, string description) 
{ 
    string fileName = parameters.fileName + " " + description + ".bin"; 

    ifstream readFile; 
    readFile.open(fileName.c_str(), ios::in|ios::binary|ios::ate); 

    int size = readFile.tellg(); 
    int length = size/4; 
    int* output = new int [length]; 

    readFile.seekg (0, ios::beg); 
    readFile.read(reinterpret_cast<char*>(output), (size)); 
    readFile.close(); 

    pointer = output; // link new array with the pointer 
    return length; 
} 

,並在主要功能:

int* testList; 
int numEntries = readIn(testList, parameters, "test"); 

我結束了一個錯誤,指出使用我testList變量和未初始化。我究竟做錯了什麼?

回答

2

函數調用後,您不會在指針變量中返回任何內容。

您可以填充一個變量,使其值在引用函數後通過取消引用其地址來保持更改。

例子:

void fillX(int *p) 
{ 
    //p holds a memory address, go to that memory address and change its value 
    *p = 4; 
} 


void main(int argc, char **argv) 
{ 
    int x; 
    fillX(&x); 
    return 0; 
    assert(x == 4); 
} 

要改變什麼指針指向你需要一個指針傳遞給一個指針。

I.e.您需要傳入指針的地址,然後您需要參數類型爲int** pointer。當你設置它,你會說*pointer = buffer;

例子:

void fillPointer(int **pp) 
{ 
    //p holds a memory address to a pointer 
    //Go to that memory address and change its value 
    *pp = new int[10]; 
} 


void main(int argc, char **argv) 
{ 
    int *x; 
    fillPointer(&x); 
    //x now points to the first element of an array 
    delete[] x; 
    return 0; 
} 

的關鍵在這裏:當你想通過參數更改值,你需要在它傳遞的地址,然後將其解引用以設置該地址處的內容。

+0

非常感謝。 – Faken 2010-03-19 16:37:13

+0

沒問題。在你的情況下,最簡單的變化可能是返回一個int *並將返回的長度作爲參數。那就是如果你想避免指向指針的指針。 – 2010-03-19 16:37:58

1
int readIn(int** pointer, param parameters, string description) 

... 

*pointer = output 

... 

int numEntries = readIn(&testList, ...) 
0

我可能是錯在這裏,但也許你需要讓你的功能,

int readIn(int **pointer, param parameters, string description) 

,即一個指針的指針。撥打電話,

int numEntries = readIn(&testList, parameters, "test"); 

變量在C/C++中按值傳遞。

相關問題