2010-05-12 38 views
0

我有一個程序需要從文件中讀取字符串數組。該數組必須是C類型字符串(char *或char [])。來自ifstream的C++字符串數組

使用下面的代碼,我得到一個壞訪問錯誤:

for (i = 0; i < MAX_WORDS && !inputFile.eof(); i++) { 
    inputFile >> words[i]; 
} 

話被聲明爲:

char *words[MAX_WORDS]; 
+0

可能要檢查其他錯誤位(失敗等) – Tom 2010-05-12 21:28:44

+0

什麼是inputFile? – Patrick 2010-05-12 21:31:06

+0

inputFile是ifstream,如標題所示。 – 2010-05-12 22:07:49

回答

2

輸入輸出流不會自動爲您分配內存,你必須事先分配。您目前只有一個包含垃圾值的指針數組。

但請注意,您不控制輸入的長度。暫時存儲到C++字符串中並分配適當大小的C字符串將是優選的。

inputFile >> std::setw(allocatedWordLength-1) >> words[i]; 
+0

我不允許在我的程序中使用C++字符串(根據我的好戰老師的意願)。 setw似乎並不適合我。我讀過它在iomanip中定義的地方,但當我嘗試使用它時遇到錯誤。 – 2010-05-12 22:14:52

+0

@David:你有沒有#include '?您可以將錯誤添加爲問題的更新,或者打開一個關於iomanip問題的新問題。 – 2010-05-12 22:31:58

+0

@老師 - 爲什麼不呢? (別擔心,這是一個反問的問題。) – jmucchiello 2010-05-13 15:21:59

0

是陣列中的每個字符串的文件中的行:

另外,您可以使用setw()操縱限制輸入長度?你使用std :: ifstream嗎?如果不這樣做,然後使用std :: getline。函數getline讀入的std :: string但是c_str()給你,好了,一個c_str直接使用或複製到到您的陣列

1

你的宣言

char *words[MAX_WORDS]; 

只分配一個指針數組,而不是記憶緩衝區。這些指針並不指向分配的內存,因此當您寫入這些地址時,會出現訪問錯誤。您需要分配緩衝區數組。一種方法是聲明一個二維數組:

char words[MAX_WORDS][MAX_WORD_LENGTH]; 

假設MAX_WORD_LENGTH設爲然而長你的話都不可能加一個空終止符。然後你的循環應該工作。

1

JohnMcG爲您的直接問題提供了一個很好的答案,但還有其他一些問題需要關注,因爲這些問題不適合發表評論。請記住,字符數組可以容納比其長度小一個字符的字符串,因此請使用MAX_WORD_LENGTH + 1作爲長度。我還建議將這些字符串初始化爲空字符串,以便在循環前面的每個字符串的開始處有一個'\ 0'。

有沒有可靠的字數限制?如果沒有,問題變得更多地涉及C風格的字符串(儘管不是C++字符串)。你必須分配指針(就像你所擁有的一樣),並在按字符讀取字符的同時根據需要重新分配它們。煩躁的東西,這是我建議使用malloc()/free()/realloc()而不是C++內存管理的一種情況。

我假設你已經意識到你在閱讀文字而不是線條。你的數組名稱暗示了這一點,但這是學生們常見的錯誤。

您在for語句中沒有聲明i,因此它是一個範圍外的變量,這可能會導致您稍後可能使用它的值。如果是這樣,請記住.eof()並不意味着程序已經用完輸入,這意味着程序試圖讀取文件的結尾。如果文件以空白字符結尾(如'\ n'),它將讀取最後一個字,然後增加i並且什麼也不讀。如果沒有,它將嘗試在讀取最後一個字時讀取文件的結尾,並且不會再次遞增i

如果你需要的話的計數,那麼,你需要有初始化內存,如上面提到的,你需要檢查words[i]是否爲空(strlen()是矯枉過正,檢查的第一個字符\0)。