[英]C++ string array from ifstream
我有一個程序,需要從文件中讀取字符串數組。 該數組必須是C類型的字符串(char *或char [])。
使用以下代碼,我得到一個錯誤的訪問錯誤:
for (i = 0; i < MAX_WORDS && !inputFile.eof(); i++) {
inputFile >> words[i];
}
單詞聲明為:
char *words[MAX_WORDS];
iostreams不會自動為您分配內存,您必須事先分配。 當前,您只有一個包含垃圾值的指針數組。
但是請注意,您不能在此處控制輸入的長度。 最好暫時存儲到C ++字符串中並分配適當大小的C字符串。
或者,您可以使用setw()
操縱器來限制輸入長度:
inputFile >> std::setw(allocatedWordLength-1) >> words[i];
您的聲明
char *words[MAX_WORDS];
僅分配一個指針數組,不為緩沖區分配內存。 這些指針沒有指向已分配的內存,因此當您寫入這些地址時,會出現訪問錯誤。
您需要分配一個緩沖區數組。 一種方法是聲明一個二維數組:
char words[MAX_WORDS][MAX_WORD_LENGTH];
假設MAX_WORD_LENGTH
設置為多長,則空終止符的單詞可能加一。 然后您的循環應該工作了。
JohnMcG為您的迫在眉睫的問題提供了一個很好的答案,但是還有其他一些要注意的問題不會在評論中顯示。 請記住,字符數組可以容納一個比其長度小1個字符的字符串,因此請使用MAX_WORD_LENGTH + 1
作為長度。 我還建議將這些字符串初始化為空字符串,以便在循環之前,每個字符串的開頭都有一個“ \\ 0”。
字詞是否有可靠的長度限制? 如果不是這樣,問題將更多地與C風格的字符串有關(盡管不是C ++字符串)。 您必須分配指針(如您所願),並在逐個字符讀取時根據需要重新分配它們。 奇怪的東西,這是我建議使用malloc()
/ free()
/ realloc()
而不是C ++內存管理的一種情況。
我認為您已經知道您正在閱讀單詞而不是行。 您的數組名稱表明了這一點,但這是學生之間的常見錯誤。
您沒有在for
語句中聲明i
,因此它是一個范圍在外部的變量,這可能會在以后使用它的值。 如果是這樣,請記住.eof()
並不意味着程序已用完輸入,而是意味着程序已嘗試讀取文件末尾。 如果文件以空格字符結尾(例如'\\ n'),它將讀取最后一個單詞,然后遞增i
,但不讀取任何內容。 如果不是,它將在讀取最后一個單詞的同時嘗試越過文件末尾,並且不會再次遞增i
。
如果您需要字數統計,則如上所述,您需要初始化內存,並且需要檢查words[i]
是否為空( strlen()
是否過大,請檢查\\0
的第一個字符)。
數組中的每個字符串是文件中的一行嗎? 您在使用std :: ifstream嗎? 如果沒有,請使用std :: getline。 getline讀入std :: string,但是c_str()給您c_str直接使用或復制到您的數組中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.