2015-11-06 31 views
0

當我在單個函數中打開一個文件時,它會打開而不會出錯。如何在單獨的功能下打開文件進行閱讀而不會出現分段錯誤?

void fileOpen(char fileName[]){ 
    FILE *file; 
    file = fopen(fileName, "r"); 
    if(file != NULL) { 
     printf("Successfully opened."); 
    } 
} 

輸出:

Successfully opened. 

然而,當我嘗試的過程中移動到一個單獨的函數,文件打開,但有段故障。

void fileOpen(FILE file, char fileName[]){ 
    file = fopen(fileName, "r"); 
    if(file != NULL) { 
     printf("Successfully opened."); 
    } 
} 

void fileStart(){ 
    FILE *mainFile; 
    char name[] = "file.txt"; 
    fileOpen(mainFile, name); 
} 

輸出:

Successfully opened. 
segmentation fault (core dumped) ./executable 

如果這是如何我傳遞變量請解釋錯誤。指針對我來說是一個弱點。

+1

提示:爲什麼void void(int i){i = 5;} int main(){int x = 2; F(X); printf(「%d \ n」,x);返回0;}'不打印5? – immibis

+0

坐下來冥想「**局部**變量」的意義(與「**全局**變量」相反)。 – Olaf

回答

1

1)你想讓你的函數void fileOpen修改它的第一個參數,你希望它的類型是FILE *。因此,第一個參數應該是一個指針這樣的指針:在fileStart

void fileOpen(FILE** file, char fileName[]){ 
    *file = fopen(fileName, "r"); 
    if(*file != NULL) { 
     printf("Successfully opened."); 
    } 
} 

2),正確地調用你的函數提供它所需要的所有參數,用正確的類型:

void fileStart(){ 
    FILE *mainFile; 
    fileOpen(&mainFile, "someFileName"); 
} 

ps:你最好讓函數fileOpen返回指針而不是修改參數。實際上,做這個東西的「好」方法是:

FILE* fileOpen(char fileName[]){ 
     FILE* file = fopen(fileName, "r"); 
     if(file != NULL) { 
      printf("Successfully opened."); 
     } 
     return file; 
    } 
    void fileStart(){ 
     FILE* mainFile = fileOpen("someFileName"); 
     if(mainFile == NULL){ 
     ... error, do something 
     } 

    } 
+0

真棒,它工作。非常感謝。給將來可能看到這個問題的任何人的一個提示:關閉if(* file!= NULL)中的文件。如果您嘗試將其從該條件語句中關閉,則會拋出另一個分段錯誤。 –

+1

只要返回'FILE *'就會更容易和更清晰。在可能的情況下,你應該避免間接。 – Olaf

+0

@確切地說。我想這樣做,但後來我決定專注於逐步解釋如何使OP的代碼正常工作,並讓他知道哪些是錯誤。 –