2011-06-13 5 views
-1

파일에서 구조로 데이터를 읽는 방법? 내가 파일 student_info.txt에서파일에서 데이터 읽기

struct data 
{ 
    char name[20]; 
    int age; 
}; 

같은 구조를 가지고 내가

ravi 12 raghu 14 datta 13 sujay 10 rajesh 13 

등 나이 많은 다른 이름이있다. 어떻게 이것을 파일에서 구조 데이터로 읽을 수 있습니까?

이 이름과 나이를 읽는 것은 루프가되어야합니다. 즉 'ravi'와 '12'를 읽은 다음이 데이터를 구조체에 압축하고 구조체를 함수에 전달해야합니다. 구조가 설정됩니다. 파일에 다시 와서 'raghu'와 '14'를 다시 읽어 와서이 데이터로 구조를 다시 채 웁니다. 파일의 모든 데이터를 읽을 때까지 루프에 있어야합니다.

논리를 구현합니까?

+3

숙제? ....... –

+1

다행스럽게도 당신이 19 바이트로 이름의 길이를 제한하는 것을주의하는 한, 다행스럽게도'scanf()'를 사용할 수 있습니다. 문자열의 끝에서 null)'scanf()'로부터 리턴 상태를 체크한다. –

+0

프로그램은 파일에서 입력하므로'fscanf'를 사용할 수 있습니다. –

답변

0

이 파일의 데이터를 읽고 일부 기준에 따라 해당 문자열을 분할하면됩니다. 파일 형식이 올바르지 않으면 데이터를 구문 분석하기가 어려울 수 있습니다.

현재 시나리오에는 파일의 이름과 숫자 만 포함되어 있으므로 문자열에서 공백 문자를 감지하면 쉽게 파싱 할 수 있습니다. 그러나 이름에 공백이 있으면 문제가 발생할 수 있습니다.

먼저 문자의 각 쌍을 다음과 같이 구분합니다. 또는 탭 또는 줄 바꿈 그런 다음 각 분리 된 문자열 사이를 공백으로 나눈 다음 char 배열에서 파일의 모든 내용을 읽은 다음 그 배열에서 하나의 레코드를 나타내는 특수 문자를 찾으십시오. 별도의 다시 다음 각 생성 된 배열 다음 다른 문자 배열의 각 레코드는 당신의 구조체에 공간 문자 및 부하에 따라 나누

이 단지에 대한 설명은, 원래의 구현이 다를 수있다,

Student std = {first string, second integer}; 

희망은 그 문서가 문제 해결 http://www.softwareprojects.com/resources//t-1636goto.html

+0

@DumbCode : 파일에 저장된 데이터가 여러 K 바이트로 실행되는 경우 수행 할 작업이 코드에서는 크기가 배열로 할당되어야합니다. 각 나이에 5 개의 이름 만 부여했습니다. 1000 인 경우 사례를 고려하십시오. 이름의 나이와 1000 그때 무엇을해야합니까? – raghavan

+0

또는 Jonathan Leffler가 제안한대로 할 수 있으며'% s' 및'% d '지정자와 함께'scanf'를 사용합니다. 이것은 전혀 어렵지 않을 것입니다. – Marlon

+0

요구 사항에 따라 달라집니다. 더 큰 크기의 데이터를 읽고 싶지 않다면 독서를 최적화해야합니다. 이 문서를 읽으면 문제가 해결 될 수 있습니다. http://www.softwareprojects.com/resources//t-1636goto.html –

1

접근 방식은 다음과 같습니다

  1. 이는 A의 인스턴스를 만듭니다 rray 구조체, 파일 액세스를위한 파일 포인터 및 카운터 변수
  2. 파일 포인터를 사용하여 파일 스트림 열기 - 파일이 성공적으로 열려 있는지 확인하십시오. fopen()이 실패하면 파일 포인터가 NULL을 가리킬 것입니다.
  3. 루프를 사용하여 구조체 배열에 데이터를 읽습니다. fscanf()는 형식 문자열과 '일치'성공의 수를 반환 - 여기가 2
  4. 파일

코드의 예를 닫습니다 (루프 조건이 사용) 것입니다 :

#include <stdio.h> 

#define FILENAME "student_info.txt" 
#define MAX_NO_RECORDS 50 

struct data 
{ 
char name[20]; 
int age; 
}; 

int main(void) 
{ 
    /* Declare an array of structs to hold information */ 
    struct data StudentInfo[MAX_NO_RECORDS]; 
    /* Declare a file pointer to access file */ 
    FILE *s_info; 
    int student_no = 0; /* holds no. of student records loaded */ 

    /* open the file for reading */ 
    s_info = fopen(FILENAME, "r"); 
    /* Check if an error has occured - exit if so */ 
    if(s_info == NULL) 
    { 
     printf("File %s could not be found or opened - Exiting...\n", FILENAME); 
     return -1; 
    } 

    printf("Loading data...\n"); 
    while(fscanf(s_info, "%19s %i", StudentInfo[student_no].name, &StudentInfo[student_no].age) == 2) 
    { 
     /* refer to records with index no. (0 to (1 - no. of records)) 
      individual members of structure can be accessed with . operator */ 
     printf("%i\t%-19s %3i\n", student_no, StudentInfo[student_no].name, StudentInfo[student_no].age); 
     student_no++; 
    } 
    /* after the loop, student_no holds no of records */ 
    printf("Total no. of records = %i\n", student_no); 
    /* Close the file stream after you've finished with it */ 
    fclose(s_info); 

    return 0; 
}