2017-09-21 34 views
-1

該文件已創建,但函數WriteFile無法寫入該文件,我需要在不是在main函數中創建該文件。如何在一個函數中創建一個文件並在其他函數中使用它

#include <stdio.h> 
    #include <stdlib.h> 

    void CreateFile(FILE *file){ 
     file = fopen("file.txt","w"); 
     if(file == NULL){ 
      printf("Error : Could not create the file"); 
     } 
    } 
    void WriteFile(FILE *file){ 
     fprintf(file,"Hello !"); 
    } 

    int main() 
    { 
     FILE *file = NULL; 
     CreateFile(file); 
     WriteFile(file); 
     fclose(file); 
     return 0; 
    } 
+3

'CreateFile'返回後,'file'的值被「忘記」了。 –

+0

你應該像這樣定義函數(在@Eugene Sh。的註釋之後)'FILE * CreateFile(FILE * file)'。該函數將返回稍後可以使用的文件描述符。 –

+0

@EugeneSh。我能做些什麼來解決這個問題? – hjx

回答

0

如Eugene Sh所述,您不保留指向您創建的文件的指針。這修復它:

#include <stdio.h> 
#include <stdlib.h> 

FILE *CreateFile(void){ 
    FILE *file = fopen("file.txt","w"); 
    if(file == NULL){ 
     printf("Error : Could not create the file"); 
     exit(1); 
    } 
    return file; 
} 

void WriteFile(FILE *file){ 
    fprintf(file, "Hello !"); 
} 

int main(void) 
{ 
    FILE *file = CreateFile(); 
    WriteFile(file); 
    fclose(file); 
    return 0; 
} 

或者,如果你想從主送出可變file到函數,使用雙指針:

#include <stdio.h> 
#include <stdlib.h> 

void CreateFile(FILE **file){ 
    *file = fopen("file.txt","w"); 
    if(*file == NULL){ 
     printf("Error : Could not create the file"); 
    } 
} 

void WriteFile(FILE *file){ 
    fprintf(file, "Hello !"); 
} 

int main(void) 
{ 
    FILE *file = NULL; 
    CreateFile(&file); 
    WriteFile(file); 
    fclose(file); 
    return 0; 
} 
+0

* minor *:它應該是'FILE * CreateFile(void)' –

+0

OP沒有void作爲fucntions的返回值,所以我堅持使用「現代」C風格並排除其中的空白... –

+0

不確定「modern」是什麼意思,但是「現代」標準確實需要'void' if一個函數不需要參數。 –

0

問題是不是文件,這是你的使用指針。在C中,函數參數按值傳遞:這意味着在調用CreateFile(file);時,在您的代碼中給出的值爲file,即NULL。 有兩種可行的解決這個問題,你可以使用一個雙指針:

void CreateFile(FILE **file); 

調用這樣的功能:

FILE *file; 
CreateFile(&file); 

或者你可以returnCreateFile()值:

FILE *CreateFile(void); 
FILE *file = CreateFile(); 

(編輯:我沒有看到@Hans PetterTaugbølKragset的回答......)

相關問題