2012-02-27 2 views
0

학생 세부 정보의 .txt 파일이 있습니다. 그래서 내가 (학생 구조)를 가리키는 링크 된 목록을 정의링크 된 목록 및 파일 I/O

struct student 
{ 
    int Std_no; 
    char* Std_name; 
    Char* Std_gender; 
} 

:

Std_no: 222 
Std_name: Dani 
Std_gender: M 

Std_no: 345 
Std_name: John 
Std_gender: M 

내가 무슨 짓을하는 것은 내가 구성원을 포함하는 구조를 만든 것입니다 다음과 같이 학생 세부 사항은 출력을 되 찾을 때 반복 할 수 있습니다.

struct sstudent_elements 
    { 
     struct student *p 
     struct student_element *next; 
    } 

내가 달성하고자하는 것은 .txt 파일을 읽고 학생 구조 구성원에게 값을 할당 할 수 있어야합니다. 귀하의 도움을 감사 & 제안. 내가하는 일에 실수 나 문제가 있으면 언제든지 말해주십시오.

감사합니다.

+5

당신이 직면하고있는 특정 문제가 무엇입니까? –

+5

무엇이 당신을 부셨습니까? 독서를 위해 파일을 여는 중입니까? 텍스트의 정확한 부분을 추출 하시겠습니까? 구조체에 할당? 연결된 목록 만들기? – alex

+2

이 숙제가 있습니까? 그렇다면 태그를 붙이십시오. – jwddixon

답변

0

이것은 숙제 인 것으로 보이므로이를 태그해야합니다.

fopen을 읽어 보는 것이 좋습니다. 그러면 파일에 액세스 할 FILE 개체를 얻는 데 도움이되며 fscanf 사용 방법의 예를 읽습니다. scanf는 일종의 까다 롭고, fgets를 사용하여 "손으로"행을 구문 분석하여 필드 구분 기호를 찾기 위해 strchr 또는 유사한 호출을 얻는 것이 더 쉬울 수도 있습니다.

+0

감사합니다. 게시물에 어떻게 태그합니까? – HShbib

+0

파일이 줄 바꿈으로 분리된다는 것을 알기 때문에'strtok'은이 시나리오에서'fscanf'보다 훨씬 낫다고 말할 수 있습니다. –

+0

strtok은 신입 사원에게 다소 혼란 스럽지만 API는 직관적이지 않습니다. 나는 사람들에게 strchr을 사용하고 분리 기호를 수동으로 누락하도록 지시하는 경향이있다. – Perry

0

이 시도 :

typedef struct 
{ 
    int Std_no; 
    char* Std_name; 
    char* Std_gender; 
} student; 

int parseStdNo(char *line) 
{ 
    return atoi(line + 8); 
} 

char *parseStdName(char *line) 
{ 
    return line + 10; 
} 

char *parseStdGender(char *line) 
{ 
    return line + 12; 
} 

int main() 
{ 
    char *fileLocation = "/path/to/my/file"; 
    FILE *file = fopen(fileLocation, "r"); 

    if (!file) 
    { 
     printf("%s\n", strerror(errno)); 
    } 

    // assume max file size of 1 kb, any more and you may consider malloc-ing your array 
    char buffer[1024]; 

    // assume max of 128 students, any more and you may consider malloc-ing your array 
    student students[128]; 

    if (fread(buffer, 1, sizeof(buffer), file)) 
    { 
     // buffer now contains our file data 
     char *line = strtok(buffer, "\n"); 
     int studentIndex = 0; 

     students[studentIndex].Std_no = parseStdNo(line); 

     // 0 is number, 1 is name, 2 is gender 
     int lineType = 1; 

     while ((line = strtok(NULL, "\n"))) 
     { 
      if (lineType == 3) 
      { 
       studentIndex++; 
       lineType = 0; 
      } 

      switch (lineType) { 
       case 0: 
       { 
        students[studentIndex].Std_no = parseStdNo(line); 
        break; 
       } 
       case 1: 
       { 
        students[studentIndex].Std_name = parseStdName(line); 
        break; 
       } 
       case 2: 
       { 
        students[studentIndex].Std_gender = parseStdGender(line); 
        break; 
       } 
      } 

      lineType++; 
     } 

     for (int i = 0; i <= studentIndex; i++) { 
      printf("student\n\tnumber %i\n\tname: %s\n\tgender: %s\n", students[i].Std_no, students[i].Std_name, students[i].Std_gender); 
     } 
    } 
    else { 
     printf("could not read from file\n"); 
    } 

    getchar(); 

    return 0; 
} 
+0

[homework tag] (http://stackoverflow.com/tags/homework/info)에서 : "문제에 대한 완전한 해결책을 묻지 말고, 우리는 당신을 위해 숙제를하러 온 것이 아닙니다." . –

+0

@OliCharlesworth 태그가 추가되기 전에 답변을 시작했습니다. –