■ 파일 입출력 ■
*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 |
'C 언어' 카테고리의 다른 글
[C언어_Day8]마방진 + 주민등록번호 검사 (0) | 2018.10.11 |
---|---|
[C언어_Day7]동적 할당 (0) | 2018.10.11 |
[C언어_Day6]함수 포인터 + Void 포인터 (0) | 2018.10.11 |
[C언어_Day5]명령 인수, 포인터 사용 (0) | 2018.10.11 |
[C언어_Day4]String 예제 (0) | 2018.10.11 |