2013-10-20 17 views
20

Ich mag eine Datei mit einem Griff verbunden schließen, aber ich bin eine Warnung vom Compiler bekommen:Implizite Deklaration der Funktion ‚close‘

main.c: 96: 2: Warnung: implizite Deklaration die Funktion 'schließen' [-Wimplicit-function-Erklärung]

und dies ist mein Code Quelle:

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <ctype.h> 
#include <errno.h> 
#include <string.h> 
... 
int handle; 
... 
handle = open(path, flags, mode); 
... 
close(handle); 

Warum erhalte ich diese Warnung, und wie kann ich sie lösen?

Dies ist der gesamte Code Quelle:

main.c

#include "header.h" 

// Prototypes 
void menu(char choix); 
void creer(); 
void lire(); 
int ouvrir(char *path, int flags, mode_t mode); 

int main(int argc, char **argv) 
{ 

    char choix; 
    int c; 
    printf(PROGRAME_NAME, CYAN_BOLD,RESETCOLOR, CYAN_BOLD_BG, RESETCOLOR, CYAN_BOLD, RESETCOLOR); 
    do{ 
     //printf("\e[1;1H\e[2J"); 
     printf("\n\n%sMenu :%s\n", RED_BOLD, RESETCOLOR); 
     printf("\t(%sC%s)réer un fichier\n", RED_BOLD, RESETCOLOR); 
     printf("\t(%sL%s)ire un fichier\n", RED_BOLD, RESETCOLOR); 
     printf("\t(%sE%s)crire sur un fichier\n", RED_BOLD, RESETCOLOR); 
     printf("\t(%sS%s)upprimer un fichier\n",RED_BOLD, RESETCOLOR); 
     printf("\t(%sQ%s)uitter\n",RED_BOLD, RESETCOLOR); 
     do{ 
      printf("\n%sVotre choix :%s ",GREEN_BOLD,RESETCOLOR); 
      do { 
       c = getchar(); 
       choix = tolower(c); 
      } while (c == '\n'); 
     }while((choix != 'c') && (choix != 'l') && (choix != 'e') && (choix != 's') && (choix != 'q')); 

     menu(choix); 
    }while(choix != 'q'); 

    return 0; 
} 


void menu(char choix){ 
    switch(choix){ 
     case 'c' : 
      creer(); 
     break; 
     case 'l' : 
      lire(); 
     break; 
     case 'e' : 
     break; 
     case 's' : 
     break; 
    } 
} 

void creer(){ 
    char path[64], name[64]; 
    char fullName[128]; 
    int fildes; 
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; 
    //~ O_RDONLY : Access Mode (Read Only) 
    //~ O_CREAT : If the file does not exist it will be created 
    //~ O_EXCL : if this flag is specified in conjunction with O_CREAT, and pathname already exists, then open() will fail. 
    int flags = O_RDONLY|O_CREAT|O_EXCL; 
    printf("\n%s-->Donner l'emplacement du fichier :%s ", CYAN_NORMAL, RESETCOLOR); 
    scanf("%s", path); 
    printf("%s-->Donner le nom du fichier :%s ", CYAN_NORMAL, RESETCOLOR); 
    scanf("%s", name); 
    snprintf(fullName, sizeof fullName, "%s/%s", path, name); 
    fildes = ouvrir(fullName, flags, mode); 
    if(fildes == -1){ 
     printf("\n\t%sImpossible de créer le fichier. Réessayez plus tard. (%s)%s",RED_UNDERLINE,strerror(errno), RESETCOLOR); 
    }else{ 
     printf("\n\t%sLe fichier %s a été créé avec succès.%s", CYAN_BOLD, fullName, RESETCOLOR); 
    } 
    close(fildes); 
} 


int ouvrir(char *path, int flags, mode_t mode) 
{ 
     return open(path, flags, mode); 
} 

header.h

#include <stdio.h> 
#include <fcntl.h> // open function 
#include <unistd.h> // close function 
#include "colors.h" 
#include "const.h" 
#include <ctype.h> 
#include <errno.h> 
#include <string.h> 
+2

Sie nie erklärt definiert oder 'open' und' close'. Wo glaubst du, kommen sie magisch her? –

+10

@KerrekSB: Devils Advokat hier spielen, um dich daran zu erinnern, dass nicht jeder so erfahren und kenntnisreich ist wie du, woher kommst du denn "magisch"? Ich musste das nicht definieren oder erklären. –

+0

@LightnessRacesinOrbit: Vermutlich verwenden Sie 'for', weil Ihr C-Lehrbuch Ihnen sagt ... und wenn es Ihnen' open' und 'close' sagt, wird es sicherlich erwähnen, wie der Code mit Kopfzeilen in C organisiert ist! –

Antwort

44

Haben Sie mit der rechten Header enthalten? Sie benötigen die folgenden:

#include <fcntl.h> // for open 
#include <unistd.h> // for close 

tun man open und man close auf Ihrem Terminal, um herauszufinden, welche Bibliotheken die sie benötigen, selbst

+0

Ich habe diesen Header eingefügt, aber ich bekomme immer noch die gleiche Warnung: /, Ich habe auch den Befehl 'man close' ausgeführt, und es zeigt mir als SYNOPSIS:' #include ' – user2874861

+1

@ user2874861 Das ist wirklich seltsam. Sie sollten diesen Fehler nicht erhalten, wenn Sie richtige Header eingefügt haben. Sie könnten Ihren gesamten Code posten? Bearbeiten Sie einfach Ihre Frage und geben Sie Ihren Code dort ein – sukhvir

+7

Warum sind 'open' und' close' in verschiedenen Headern? O.o – Kevin

Verwandte Themen