2017-04-23 30 views
-1

我不得不停止編碼這麼多項目,因爲這個奇怪的怪癖,我厭倦了足夠的問題和風險看起來像一個白癡,所以這裏去...爲什麼從函數返回一個C字符串會導致隨機字符?

我寫了這樣的功能:

const char* readFileToString(const char* filename) { 
    const char* result; 
    std::ifstream t(filename); 
    std::stringstream buffer; 
    buffer << t.rdbuf(); 
    result = buffer.str().c_str(); 
    return result; 
} 

我預計,如果file.txt包含hello,即readFileToString("file.txt")應該返回hello。相反,它會返回符合H�rv�0行的亂碼文本。但是,如果我在退貨之前放置了std::cout << result;,它將打印hello

這是一些奇怪的,不可思議的C++嗎?我如何解決它?

+3

返回指針到本地或臨時變量是很少的好理念。只需使用std :: string,由值返回。 –

回答

3

這既不奇怪也不可能;您返回了指向超出範圍的緩衝區的指針。 const char*不「擁有」字符串數據,它只是指它。或者,它曾經!一旦返回,該指針現在無效。你不應該解除引用。

我建議你堅持用std::string而不是冒險進入先進的指針技術。

std::string readFileToString(const char* filename) 
{ 
    std::ifstream t(filename); 
    std::stringstream buffer; 
    buffer << t.rdbuf(); 
    return buffer.str(); 
} 

不幸的是,我不知道有任何方法可以避免在這裏複製。

如果你不介意洗牌約一點點你的設計,如果你有一些方法來避免流對字符串複製的路線,你可以這樣做,而不是:

void readFileToStream(const char* filename, std::ostream& os) 
{ 
    std::ifstream t(filename); 
    os << t.rdbuf(); 
} 

你不妨返回bool表示流的狀態,但是您仍然可以在調用網站上執行此操作。

1

請參閱下面的註釋:

const char* readFileToString(const char* filename) { 
    const char* result; 
    std::ifstream t(filename); 
    std::stringstream buffer; // Behind the scenes some memory will/is allocated 
    buffer << t.rdbuf();  // Memory is getting filled 
    result = buffer.str().c_str(); // Getting the address of that memory 
    return result; 
    // Buffer getting destroyed along with the allocated memory (what result points to) 
} 

。這裏的結果指向一個無效的內存位置

所以因此它被損壞

相關問題