2017-04-26 45 views
-1

我有一個名爲actions有多個文件名,空格字符串,並且這些文件的名稱之間的換行,像這樣:ifstream的分段錯誤

File1 File2 File3 File4 
File5 File6 File7 File8 

我想逐一打開這些文件,所以我按空格分割字符串以分別獲取文件名。

std::stringstream ss(actions); 
std::string newline; 

while(std::getline(ss, newline, '\n')){ 
    std::stringstream s1(newline); 
    std::string espacos; 
    std::getline(s1,espacos,' '); 
    char* file = &espacos[0u]; 
    cout << file << '\n'; 
    ifstream ficheiro; 
    ficheiro.open(file); 
    .... 
} 

這是我分裂的地方。

字符串espacos是通過逐個獲取文件名來遍歷換行符的字符串。

我從string轉換爲char*但最終我得到了分段錯誤。

我用了一個調試器,它說,這條線是造成分段錯誤:

ficheiro.open(file); 

所以我打印char* file檢查,如果一切正常,我也得到這樣的輸出:

File1 
File2 
File3 
File4 

由於文件名一切正常,我可以打開每個文件,但是File4,你認爲是什麼原因導致了這個錯誤? PS:我在每個循環之後關閉文件。

+7

請** [編輯] **用[MCVE]或[SSCCE(短的,獨立的,正確的示例)](HTTP你的問題:// SSCCE。org) – NathanOliver

+0

該代碼僅在每行上獲得第一個名稱。必須有一些重要的缺失。 – molbdnilo

+0

我忘記了它獲得每個名字的循環。 –

回答

1

我可以看到顯示爲段錯誤的代碼的唯一方法是如果file沒有指向有效的以NULL結尾的C風格字符串。

如果可能發生:

  • 您的STL的實現std::string不使用連續的內存塊來保存單個字符。

  • 你的STL的std::string的實現確實使用了一個連續的內存塊,但是並沒有終止那個內存塊。

無論哪種方式會導致&espacos[0u]產生的指針不是一個有效的空值終止的C風格的字符串。大多數STL實現確實使用了一個連續的以NULL結尾的內存塊(因爲它簡化了實現),但是直到C++ 11才執行這樣的實現,這是不能保證的。

在任何情況下,您都不應使用&espacos[0u]開始。您應該使用espacos.c_str()代替,這是在所有的C++版本,保證返回一個指向空結尾的C風格的字符串:

const char* file = espacos.c_str(); 

話雖這麼說,operator>>分割在默認情況下空格和換行流,這樣可以大大簡化代碼,以這樣的:

std::istringstream iss(actions); 
std::string espacos; 

while (iss >> espacos) { 
    cout << espacos << '\n'; 
    ifstream ficheiro(espacos.c_str()); 
    // or, in C++11 and later: 
    // ifstream ficheiro(espacos); 
    ... 
} 
+0

我發現問題出在什麼地方,而且我在VBO中使用OpenGl,問題在於vbo,但是我想感謝您,因爲您提供了一些提示。 –