2012-11-28 29 views
1

是的,我有這樣的問題,因爲我一直很難遵循指針操作。所以,我有這個簡單的代碼:無法將文件讀入字符數組(某些指針問題,像往常一樣)

struct myfile { 
    char* name; 
    char* content; 
    long size; 
}; 

myfile this_file; 

int main() { 
    read(); 
    return 0; 
} 

void read() { 
    output("Please, specify file name: "); 
    cin >> (this_file.name = new char); 
    FILE *stream; 
    stream = fopen(code.name, "r"); 
    if (stream != NULL) { 
     fseek(stream , 0, SEEK_END); 
     myfile.size = ftell(codefile); 
     myfile.content = new char[myfile.size]; 
     fseek(myfile, 0, SEEK_SET); 
     if ((fread(myfile.content, 1, myfile.size, stream)) == 0) { 
      fclose(codefile); 
      cout << "File is empty!\n"); 
     } 
    } 
} 

它得到正確的文件名,它獲取內容的大小,而是試圖分配空間給content成員時,程序崩潰,這是我所知道的是一些指針問題,但一如既往,不記得/弄清楚它是什麼。它達到此線時崩潰:myfile.content = new char[myfile.size];

我需要你的幫助了。謝謝!

回答

6

這引起緩衝區溢出:

cin >> (this_file.name = new char); 

作爲operator>>()將消耗字符,直到下一個空白字符和寫入this_file.name僅具有用於單個字符足夠的空間。

使用std::string(而不是char*)與std::getline()

std::string name; 
if (std::getline(cin, name)) 
{ 
    // Use 'name'. 
} 

如果您正在調查,你需要分配的char數組,並防止讀取分配的數組超出指針:

this_file.name = new char[32]; 
if (cin.getline(this_file.name, 32)) 
{ 
} 

記住到deletedelete[]什麼是newnew[]

使用流將文件的內容讀入std::string是另一種選擇。見What is the best way to read an entire file into a std::string in C++?

+0

謝謝!今天我學到了一些新東西。 – ali

0

使用std :: string而不是char *和std :: ifstream而不是FILE *,所有問題都將被解決。

+0

這不是一個真正的答案。很好,你還沒有推薦使用Java。 – 2012-11-28 15:08:33

+0

是的,我知道我可以使用字符串,但我試圖結束指針問題,我一直有。 – ali

+0

@VladLazarenko這確實是一個答案。它與Java有什麼關係? – user1610015

3

要清楚這是告訴你關於指針問題,你不應該在任何生產代碼中使用像這樣的指針,使用字符串或向量,這是什麼!

此行: - cin >>(this_file.name = new char); 有點....奇怪

雖然這樣做是合法的,但任何有經驗的C++程序員都會很驚訝。

此外,您只分配一個單個字符,這將足以存儲終止的空字符,但沒有實際的文本。

做這樣的事情 -

this_file.name = new char[100]; 
cin >> this_file.name; 

正如其他人雖然說,不這樣做在現實生活中,除了學習,你必須猜測的投入將有多大,如果用戶發送更多它會打破東西。您在瀏覽器中閱讀過的所有安全漏洞等等?這是他們如何發生的! :)

這段代碼似乎還有其他問題,例如創建一個名爲this_file的變量,然後顯然希望它在下一部分被稱爲「代碼」,所以它需要更多的修復這個指針問題。

此外,請記住「刪除[] this_file.name」以釋放最後的內存。如果你真的想在這裏使用你自己的內存分配,最好還是使用std :: unique_ptr。

+1

是的,我只是在學習C++。如果我不得不創建一些有用的應用程序,我會利用任何圖書館,並節省大量時間和問題。謝謝! – ali