我正在嘗試在 C 中創建一個函式,該函式獲取檔案的內容并將內容作為字串回傳。除了一個奇怪的細節外,我讓它作業了。這是當前代碼:
char *getFileContents(const char *filePath) {
if (filePath == NULL) return NULL;
char buffer[1000];
char character;
int count = 0;
FILE *f = fopen(filePath, "r");
while (character != EOF) {
count ;
character = fgetc(f);
printf("%c\n", character);
}
count--;
fclose(f);
FILE *F = fopen(filePath, "r");
char *str = (char*) malloc ( sizeof(char) * (count 1 ) );
char *line = fgets(buffer, 1000, F);
while (line != NULL) {
strcat(str, line);
line = fgets(buffer, 1000, F);
}
fclose(F);
return str;
}
在第一個 while 回圈中,我添加了一個 printf 陳述句來進行我不再需要的錯誤檢查。該函式適用于 printf 陳述句,但每當我將其注釋掉或將其洗掉時,都會出現分段錯誤。我已經使用 gdb 進行除錯并嘗試找出問題所在。我可以單步執行整個函式,但是當它到達return str最后時,我會遇到分段錯誤。我不確定我為什么會遇到這個問題。
uj5u.com熱心網友回復:
一個問題是您永遠不會初始化由回傳的記憶體緩沖區malloc()——您顯然希望它是全零(或至少以 0 位元組開頭),以便您可以通過呼叫strcat();來填充它。但malloc()不保證它回傳的記憶體內容將被清零,因此您可能會從str緩沖區中已經存在的一些垃圾位元組開始,這意味著當您從檔案中添加更多位元組時,您可能會寫超過緩沖區的末尾并呼叫未定義的行為(并且可能會崩潰)。
簡單的解決方法是str[0] = '\0';在呼叫之后執行 a malloc()(或者如果您偏執,您可以執行 full memset(str, 0, count 1);)。或者,您可以通過呼叫calloc()而不是 malloc() 來分配記憶體,因為calloc()這樣可以保證回傳的緩沖區都是零初始化位元組。
uj5u.com熱心網友回復:
注釋導致分段錯誤的行是未定義行為的表現。
characterwith的初始比較EOF讀取一個未初始化的垃圾值。
char character;
/* ... */
while (character != EOF) {
/* ... */
發生這種情況后,無法推斷該程式的結果。隨機 SIGSEGV 是課程的標準。
此外,fgetc回傳一個int. 是負值,如果是 unsignedEOF則無法正確表示。char
嘗試改變你的回圈結構。
int character;
/* ... */
while (EOF != (character = fgetc(f))
count ;
請注意,您還應該檢查來自fopenwas not的回傳值NULL,并做出相應的反應。
FILE *f = fopen(filePath, "r");
if (!f) {
perror(filePath);
return NULL;
}
uj5u.com熱心網友回復:
我擺脫了第一個計算檔案中字符數的 while 回圈,并將其移至不同的函式。我將它移到的函式將負責計算字符數。這樣,我只需要函式中的一個fopenandfclose陳述句getFileContents。這解決了我的問題,一切都按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/530150.html
下一篇:更新檔案中的資料
