■ 파일 입출력 ■


*fopen으로 열고 flose로 닫는다.


개방 모드 

 파일이 있을 때

 파일이 없을 때

 r

읽기만 

null 반환 

 w

내용 지우고 쓰기 

새로운 파일 자동 생성 

 a

내용 이어 쓰기 

새로운 파일 자동 생성 


1. fopen -> 메모리에 stream file 생성

*stream file은 문자 배열 형태의 버퍼를 가지고 있다.


버퍼에서 데이터를 읽거나 쓸 때 필요한 정보들을 구조체로 묶어서 보관합니다.

(=> 파일의 데이터 양을 버퍼만으로 관리할 수 없어서)

그래서 파일 포인터(파일 구조체 주소)를 반환합니다.



#문자 입력 함수 fgetc : 파일에서 문자 입력(파일에서 데이터를 읽어옴)

#문자 출력 함수 fputc : 문자를 파일에 출력(파일에 데이터 저장)



텍스트 파일

 바이너리 파일

 r, w, a

 rb, wb, ab

 +를 붙이면 읽고 쓰기 작업이 동시에 가능

(r+, w+, a+, rb+, wb+, ab+)


*텍스트 파일은 아스키 코드값에 따라 데이터를 읽고 

그외의 파일 형식을 바이너리 파일이라고 알고 있으면 된다.

(바이너리 파일 같은 파일은 메모장으로 열면 안보이고 Notepad++같은 tool을 이용해서 볼 수 있다) 



#문자 입력 함수 fgets 

#문자 출력 함수 fputs 

*문자열을 읽을 때 주의 할 점 : 문자열의 마지막 앞에 (NULL 앞에) \n(개행문자)가 존재한다는 것을 인식하자


예)        .txt

abc

def

123


1. 첫 줄 읽어 오기

2. str[strlen(str) -1] = '\0';    //개행문자를 대신하면 \0을 넣어줘서 개행문자 제거



#입력 함수 fscanf 

#출력 함수 fprintf


->흔히 쓰는 scanf, printf를 파일을 지정하여 쓸 수 있다 => 보편적으로 많이 이용한다.


/*형식 예

FILE *fp;

int res = fscanf(fp, "%s%d",name,&data);

*/


#파일을 읽기 전용 으로 읽을 때 파일이 있는지 예외처리를 해주자

<예>

FILE *fp;

if(fp ==NULL)

{

return 1;

}



#파일의 내용이 있는지 검는지 검사 형식


*파일을 다 읽으면 EOF를 반환한다.

*입력시 Ctrl + z를 누르면 EOF(-1)를 반환 한다.

1.

if(res ==EOF)//

{

break;

}


2.

if(feof(fp))

{

break;

}



#매출 관리 프로그램

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
typedef struct
{
    char title[30];   
    double price;     
    int count;          
    double tot;    
     
} Book;
 
int check(char *title, Book *book, int count);
 
int main()
{
    FILE *ifp,*ofp;
    Book book[10];
    char title[30]; 
    double price;     
    int count,i=0,num,k;  
    int j;
    int max; 
    
    ifp = fopen("a.txt","r");
    if(ifp == NULL)
    {
        printf("a.txt 열지 못했습니다.\n");
        return 1;
    }
    
    ofp = fopen("b.txt""w");
    if (ofp == NULL)
    {
        printf("b.txt 열지 못했습니다.\n");
        return 1;
    }
    
    fgets(title,sizeof(title),ifp);
    
    while(!feof(ifp))
    {
 
        title[strlen(title)-1= '\0';
        fscanf(ifp,"%lf%d",&price,&count);
        fgetc(ifp);
        num = check(title, book,i);
        
        if(num>=0)
            {
                book[num].tot +=(price * count);
            }
        else
            {
            strcpy(book[i].title,title);
            book[i].price=price;
            book[i].count = count;
            book[i].tot = price * count;
            i++;
            }
            
        fgets(title,sizeof(title),ifp);    
    }
 
    
    //정렬
    k=i;
 
    for(i=0;i<k-1;i++)
    {
        max = i;
        for(j=i+1;j<k;j++)
        {
            if(book[j].tot > book[max].tot)
            max = j;    
        }    
        
        if(max !=i)
        {
        Book temp;
        temp = book[i];
        book[i]=book[max];
        book[max]=temp;
        }
    }
    
    //파일로 출력(저장) 
    for(i=0;i<k;i++)
    {
        fprintf(ofp,"%d. %s - %.0lf원\n", i+1,book[i].title,book[i].tot * 10000.0); 
    }
 
    fclose(ifp);
    fclose(ofp);
    return 0
}
 
//팩 제목이 같으면 가격만 add 
int check(char *title, Book *book, int count)
{
    int i;
    for(i=0;i<count;i++)
    {
        if(strcmp(title,book[i].title)==0)
        return i;//같으면  i번째 
    }
    return -1;//없으면 return
}
cs










+ Recent posts