2014-12-26 4 views
0

파일에서 정보를로드하여 테이블에 저장하려고하지만 정보를로드하는 동안 오류가 발생하여 파일에 저장된 정보가 표시되지 않습니다 (void charger_Etudiant(Etudiant *E)). 누군가가 나를 기능이파일에서 테이블로 정보로드

typedef struct Etudiant 
{ 
    char nom[64]; 
    char prenom[64]; 

    char CNI[64]; 
    int sante; 
    int niveau_scolaire; 
    int Code_confidentiel; 
    int CNE; 
} Etudiant; 

:)하시기 바랍니다 도움 : 다음과 같은 형태로 작성되는 파일에 exemple 정보에 대한

void charger_Etudiant(Etudiant *E) 
{ 
    int i=0; 
    FILE *fichier = NULL; 
    fichier = fopen("Info_Etudiant.txt", "r"); 

    if (fichier != NULL) 
    { 
     while(i<2&&!feof(fichier)) 
     { 
     fscanf(fichier,"%d\t\t%s %s\t\t%d\t\t%s\t\t%d\t\t%d",&E[i].Code_confidentiel,E[i].nom,E[i].prenom,&E[i].CNE,E[i].CNI,&E[i].niveau_scolaire,&E[i].sante); 
     printf("%d\t\t%s %s\t\t%d\t\t%s\t\t%d\t\t%d",E[i].Code_confidentiel,E[i].nom,E[i].prenom,E[i].CNE,E[i].CNI,E[i].niveau_scolaire,E[i].sante); 
     i++; 
     } 
     fclose(fichier); 
    } 
} 

나는 테이블 구조에 저장하려면 :

,451,515,

123 바다 하리는 10,043,720 SJ26825 1 3

+1

(a) 몇 가지 샘플 입력을 보여줍니다. (b) 어떤 문제가 발생했는지 정확하게 알려주십시오 (오류가 있습니까?). – Rufflewind

+0

텍스트 형식으로 저장해야합니까? –

+0

함수 "" "charger_Etudiant (Etudiant * E)" ""는 파일에 저장된 정보를 게시하지 않습니다. 이 문제는 – Skimmo

답변

2

나는 scanf() 또는 fscanf()의의 팬이 아니다. 여기에 atoi()으로 충분하지만 fgets()strtok()sscanf()을 사용하여 필드를 추출하는 것을 선호합니다. strtok()의 장점 중 하나는 필드 구분 기호가 변경되면 하나의 조정 만 필요하다는 것입니다.

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

#define STRLENG  63 

typedef struct Etudiant { 
    char nom [STRLENG+1]; 
    char prenom [STRLENG+1]; 
    char CNI [STRLENG+1]; 
    int sante; 
    int niveau_scolaire; 
    int Code_confidentiel; 
    int CNE; 
} Etudiant; 

int charger_Etudiant(Etudiant *E) { 
    int i=0; 
    char buff[512]; 
    char *tok; 
    char delims[] = "\t\n"; 
    FILE *fichier = NULL; 
    fichier = fopen("Info_Etudiant.txt", "r"); 
    if (fichier != NULL) { 
     while(fgets (buff, 512, fichier) != NULL) { 
      memset(&E[i], 0, sizeof(Etudiant)); 
      if (tok = strtok (buff, delims)) { 
       E[i].Code_confidentiel = atoi(tok); 
       if (tok = strtok (NULL, delims)) { 
        strncpy (E[i].nom, tok, STRLENG); 
        if (tok = strtok (NULL, delims)) { 
         strncpy (E[i].prenom, tok, STRLENG); 
         if (tok = strtok (NULL, delims)) { 
          E[i].CNE = atoi(tok); 
          if (tok = strtok (NULL, delims)) { 
           strncpy (E[i].CNI, tok, STRLENG); 
           if (tok = strtok (NULL, delims)) { 
            E[i].niveau_scolaire = atoi(tok); 
            if (tok = strtok (NULL, delims)) { 
             E[i].sante = atoi(tok); 
            } 
           } 
          } 
         } 
        } 
       } 
      printf("%d\t\t%s %s\t\t%d\t\t%s\t\t%d\t\t%d\n", 
        E[i].Code_confidentiel, E[i].nom, E[i].prenom, 
        E[i].CNE, E[i].CNI,E[i].niveau_scolaire,E[i].sante); 
      i++; 
      } 
     } 
     fclose(fichier); 
    } 
    return i; 
} 

int main() { 
    return 0; 
} 
1
  1. EOF 조건을 감지 feof()를 사용하지 마십시오. 대신 입력 함수에서 반환 값을 확인하십시오. @Weather Vane처럼

  2. fgets()

을 사용하는 것이 좋습니다.

#define MAXINTLEN (20) 
// Use 2x size line buffer 
#define MAXLINELEN ((sizeof(Etudiant) + 4*MAXINTLEN) * 2) 

char buffer[MAXLINELEN + 2]; 

while (fgets(buffer, sizeof buffer, fichier) != NULL) { 
    int cnt = sscanf(buffer,"%d%63s%63s%d%63s%d%d", 
     &E[i].Code_confidentiel, E[i].nom, E[i].prenom, &E[i].CNE, 
     E[i].CNI, &E[i].niveau_scolaire, &E[i].sante); 
    if (cnt != 7) { 
    break; // scan error 
    } 
    printf("%d\t\t%s %s\t\t%d\t\t%s\t\t%d\t\t%d", 
     E[i].Code_confidentiel, E[i].nom, E[i].prenom, E[i].CNE, 
     E[i].CNI, E[i].niveau_scolaire, E[i].sante); 
    i++; 
} 

"\t\t"을 스캔 할 때 반드시 2 개의 탭을 스캔하는 것은 아닙니다. scanf()의 공백 (%[] 제외)은 공백을 검사합니다. 코드는 명확성을 위해 sscanf(buffer,"%d %63s %63s %d %63s %d %d", ...을 사용할 수 있지만 동일한 작업을 수행합니다.

지정자 "%d""%s"은 공백을 가장 많이 사용합니다.

항상 문자열 입력을 제한하십시오. 예 : %63s

관련 문제