我有一個程序需要從文件中讀取字符串數組。該數組必須是C類型字符串(char *或char [])。來自ifstream的C++字符串數組
使用下面的代碼,我得到一個壞訪問錯誤:
for (i = 0; i < MAX_WORDS && !inputFile.eof(); i++) {
inputFile >> words[i];
}
話被聲明爲:
char *words[MAX_WORDS];
我有一個程序需要從文件中讀取字符串數組。該數組必須是C類型字符串(char *或char [])。來自ifstream的C++字符串數組
使用下面的代碼,我得到一個壞訪問錯誤:
for (i = 0; i < MAX_WORDS && !inputFile.eof(); i++) {
inputFile >> words[i];
}
話被聲明爲:
char *words[MAX_WORDS];
輸入輸出流不會自動爲您分配內存,你必須事先分配。您目前只有一個包含垃圾值的指針數組。
但請注意,您不控制輸入的長度。暫時存儲到C++字符串中並分配適當大小的C字符串將是優選的。
inputFile >> std::setw(allocatedWordLength-1) >> words[i];
我不允許在我的程序中使用C++字符串(根據我的好戰老師的意願)。 setw似乎並不適合我。我讀過它在iomanip中定義的地方,但當我嘗試使用它時遇到錯誤。 – 2010-05-12 22:14:52
@David:你有沒有#include
@老師 - 爲什麼不呢? (別擔心,這是一個反問的問題。) – jmucchiello 2010-05-13 15:21:59
是陣列中的每個字符串的文件中的行:
另外,您可以使用setw()
操縱限制輸入長度?你使用std :: ifstream嗎?如果不這樣做,然後使用std :: getline。函數getline讀入的std :: string但是c_str()給你,好了,一個c_str直接使用或複製到到您的陣列
你的宣言
char *words[MAX_WORDS];
只分配一個指針數組,而不是記憶緩衝區。這些指針並不指向分配的內存,因此當您寫入這些地址時,會出現訪問錯誤。您需要分配緩衝區數組。一種方法是聲明一個二維數組:
char words[MAX_WORDS][MAX_WORD_LENGTH];
假設MAX_WORD_LENGTH
設爲然而長你的話都不可能加一個空終止符。然後你的循環應該工作。
JohnMcG爲您的直接問題提供了一個很好的答案,但還有其他一些問題需要關注,因爲這些問題不適合發表評論。請記住,字符數組可以容納比其長度小一個字符的字符串,因此請使用MAX_WORD_LENGTH + 1
作爲長度。我還建議將這些字符串初始化爲空字符串,以便在循環前面的每個字符串的開始處有一個'\ 0'。
有沒有可靠的字數限制?如果沒有,問題變得更多地涉及C風格的字符串(儘管不是C++字符串)。你必須分配指針(就像你所擁有的一樣),並在按字符讀取字符的同時根據需要重新分配它們。煩躁的東西,這是我建議使用malloc()
/free()
/realloc()
而不是C++內存管理的一種情況。
我假設你已經意識到你在閱讀文字而不是線條。你的數組名稱暗示了這一點,但這是學生們常見的錯誤。
您在for
語句中沒有聲明i
,因此它是一個範圍外的變量,這可能會導致您稍後可能使用它的值。如果是這樣,請記住.eof()
並不意味着程序已經用完輸入,這意味着程序試圖讀取文件的結尾。如果文件以空白字符結尾(如'\ n'),它將讀取最後一個字,然後增加i
並且什麼也不讀。如果沒有,它將嘗試在讀取最後一個字時讀取文件的結尾,並且不會再次遞增i
。
如果你需要的話的計數,那麼,你需要有初始化內存,如上面提到的,你需要檢查words[i]
是否爲空(strlen()
是矯枉過正,檢查的第一個字符\0
)。
可能要檢查其他錯誤位(失敗等) – Tom 2010-05-12 21:28:44
什麼是inputFile? – Patrick 2010-05-12 21:31:06
inputFile是ifstream,如標題所示。 – 2010-05-12 22:07:49