2012-11-25 70 views
0

我試圖從文本文件中讀取字符,直到EOF,把它們放到字符數組中,以便我可以在後面操作它。用g ++編譯沒有錯誤,在運行時,系統會提示輸入文件,但它只是掛起。如何從文本文件中逐字符讀取字符並將其放入字符數組中?

int main (int argc, char *argv[]) { 
    string filename; 
    ifstream infile; 

    char *cp, c[1024]; 
    memset (c, 0, sizeof(c)); 
    cp = c; 

    cout << "Enter file name: " << endl; 
    cin >> filename; 

    //open file 
    infile.open(filename.c_str()); 

    //if file can't open 
    if(!infile) { 
     cerr << "Error: file could not be opened" << endl; 
     exit(1); 
    } 

    while (!infile.eof()); { 
     infile.get(c, sizeof(infile)); 
     // get character from file and store in array c[] 
    } 
}//end main 
+1

見http://stackoverflow.com/q/7241871/485561 – Mankarse

+1

你不應該由炭炭閱讀。這不是20世紀80年代... – dda

+0

我應該提到它是爲我的任務,但這是很好的知道。 – harman2012

回答

1

你應該嘗試istream::read()方法,而不是get()。這將有助於解決任何緩衝區溢出:

unsigned int chars_read = 0; 
//... 
// Read in the file. 
if (!infile.read(c, sizeof(c)) 
{ 
    // Handle the read error here. 
    // Also check for EOF here too. 
} 

// Obtain the number of characters actually read. 
chars_read = infile.gcount(); 
+0

謝謝,這是非常有益的! – harman2012

0

首先,你想測試eof()!不知何故,我開始覺得唐吉訶德找到了我的風車。不過,我知道你需要檢查輸入是否成功試圖讀取它,因爲在嘗試讀取流之前,無法知道它是否會成功。

你的程序其實不會掛!它只是等待您輸入sizeof(infile)個字符或結束輸入(例如,在Windows上使用Ctrl-D和在Windows上使用Ctrl-Z)。當然,這可能看起來像一個掛起的程序。您可以通過使用較小的尺寸驗證這確實是問題,例如4。當然,sizeof(infile)幾乎與一個小的隨機數字一樣好:它是std::ifstream類型的對象的大小,誰可以告訴它是什麼?您可能打算使用sizeof(c)以確保對get(c, n)的呼叫不會寫入比適合c更多的字符。

+0

OP還需要檢查讀取的字符數量與陣列容量。否則會發生緩衝區溢出。 –

+0

謝謝大家,改變sizeof(c)並做一個infile.gcount()已經有所幫助。我注意到,當我的文件正在讀取時,它只會讀取直到下一個返回行(因此只讀取一行)? – harman2012

+0

我曾經使用過infile.get()和infile.read(),但是infile.read()忽略了新行。 – harman2012

0

試試這個:

int cont = 0; 
while(infile.good()) { 
    c[cont++] = infile.get(); 
} 
+0

解決方案可能導致緩衝區溢出。如果文件大小大於1024,則開始寫入數組。 –

+0

是的,但不要責怪我,他是最大的限制:D – hinafu

相關問題