2012-05-06 93 views
1

我正在嘗試寫入到文本文件。當我不使用我的for循環時,我可以寫得很好,但是當我實現它來將所有數組寫入文件時,它會崩潰。這是我的代碼:在for循環中崩潰

void writeFile(void) 
{ 
    char *fileName[30]; 
    cout << "enter a filename"; 
    cin >> *fileName; 
    ofstream myfile; 
    myfile.open (*fileName); 
    int p; 

    for(p = 0; p <= i; p++) 
    { 
     myfile << right << setw(4) << setfill('0') << packet[i].getSource() << ":"; 
     myfile << right << setw(4) << setfill('0') << packet[i].getDest() << ":"; 
     myfile << right << setw(4) << setfill('0') << packet[i].getType() << ":"; 
     myfile << right << setw(4) << setfill('0') << packet[i].getPort() << endl; 
    } 

任何想法,我哪裏出錯了?

+0

什麼是我?它似乎沒有在任何地方定義。 –

+3

什麼是我定義的! – James

+2

它看起來像是當你引用'packet [i]'你可能意思是'packet [p]' – Bob

回答

3

fileName是一個由30個未初始化的char指針組成的數組。 *fileNamefilename[0]相同,它是一個未初始化的char指針。你不能使用這個指針來做任何事情,只是給它分配一個有效的值。儘管如此,你並沒有這樣做,而是試圖向它讀取數據,並帶來可預見的災難性後果。

總之,你不應該使用在任何C指針++可言,而是使用std::string您的具體情況:

std::string fileName; 
if (!(std::cin >> fileName)) { /* I/O error, die */ } 
// ... 

(也許你的意思做的,就是讓fileName數組30個字符:char fileName[30];但不這樣做,即使它可能工作,這是非常可怕的)

+0

+1爲經典'沒有malloc任何空間的字符串,但無論如何cinned' –

+0

謝謝你的答案!我已經更改爲一個字符串,並刪除指針,但我得到一個錯誤: 錯誤:沒有匹配函數調用'std :: basic_ofstream > :: open(std: :串)「| – user1373475

+1

在舊的C++中,沒有構造函數來自'string'的'ofstream'。這已經在C++ 11中得到修復,但同時,說'std :: ofstream f(fileName.c_str());'。抱歉給你帶來不便。 –

2

這裏有另一件事情稍微狡猾:。

for(p = 0; p <= i; p++) 

你可能想

for(p = 0; p < i; p++) 

,讓你不要試圖取消引用了你的數組的末尾

可能更好寫

for (int p = 0; p != i; ++p) 

這是根據武推薦的形式和Koenig:http://www.drdobbs.com/cpp/184402072

我也不會使用char *cin中讀取,請使用std::string來存儲你的字符串和輸入,你不需要new這個存儲器,如果它不在你主要的writeFile函數的範圍之外。字符串還支持動態調整大小,因此您不需要將其初始化爲任何大小,這裏是我使用Google搜索的第一個示例understand

1

爲什麼使用「C方式」存儲文件名?而你用錯了它:char **。它會更容易只需要聲明:

std::string fileName; 
while(!std::cin >> fileName); 
ofstream myfile(fileName.c_str()); 

也正在使用我你的循環內但迭代P,我覺得這不是你想要做什麼......