嘗試從檔案中讀取以在我創建的小游戲中使用。我正在使用 fgets 函式。它回傳一個分段錯誤,不知道為什么。
它正在讀取的檔案僅在 txt 檔案中包含“20 10”,因為這是地圖大小。
我的 readfile 函式如下所示
if (argc == 2) {
f = fopen("map.txt", "r");
if (NULL == f) {
printf("File cannot be opened.");
}
while (fgets(fileRead, 50, f) != NULL) {
printf("%s", fileRead);
}
fclose(f);
}
if (argc == 2) 可以忽略,這只是為了讓這個部分運行,因為我正在修改一個檔案,所以只需通過滿足 if 陳述句來運行這個函式。
我對C相當陌生,如果我遺漏了一些小東西,我深表歉意。值得注意的是,我正在使用 C89 編程并使用 -Wall -ansi -pedantic 編譯選項,因為這是大學作業,導師希望我們做 C89。
編輯:
char userInput, fileRead[50];
FILE* f;
變數宣告。
uj5u.com熱心網友回復:
假設您的問題確實出在您發布的代碼中,而不是程式中的其他地方,那么我相信您的問題是由以下問題引起的:
呼叫fopen后,立即檢查函式的回傳值,以驗證它是否成功。但是,如果它沒有成功并回傳NULL,您所做的就是列印一條錯誤訊息,stdout但繼續執行,就好像它成功了一樣。這將導致作為流引數呼叫,這將呼叫未定義的行為并可能導致您的分段錯誤fgets。NULL
在評論部分,您對此解釋提出了以下反對意見:
但是它無論如何都不會列印錯誤訊息并且仍然存在分段錯誤,所以我認為問題不在這里?
你的這個反對意見是有缺陷的,原因如下:
當發生分段錯誤時,程式的執行立即停止。輸出緩沖區的內容不會被重繪 。這意味著當發生分段錯誤時,輸出可能會丟失。這可能就是您的情況。
如果您想確保即使在分段錯誤的情況下也能實際列印輸出,您應該通過fflush( stdout );在 print 陳述句之后立即呼叫來重繪 輸出緩沖區。或者,您可以列印到stderr而不是stdout. 相比之下stdout,流stderr默認是無緩沖的,所以不存在這個問題。
您可以通過更改線路來測驗我的懷疑是否正確
printf("File cannot be opened.");
至
printf("File cannot be opened.");
fflush( stdout );
或者:
fprintf( stderr, "File cannot be opened." );
如果現在列印了錯誤訊息,那么這可能意味著我的懷疑是正確的。
無論如何,我建議您更改線路
if (NULL == f) {
printf("File cannot be opened.");
}
到以下:
if (NULL == f) {
fprintf( stderr, "File cannot be opened." );
exit( EXIT_FAILURE );
}
這樣,如果發生,程式將立即退出,而不是繼續執行。
請注意,上面發布的代碼要求您#include <stdlib.h>.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/516687.html
標籤:C
下一篇:如何在C中重復回圈
