簡體   English   中英

來自ifstream的C ++字符串數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM