C Express 16 2012 All rights reserved ress

  • Slides: 89
Download presentation
쉽게 풀어쓴 C언어 Express 제 16장 파일 입출력 © 2012 생능출판사 All rights reserved

쉽게 풀어쓴 C언어 Express 제 16장 파일 입출력 © 2012 생능출판사 All rights reserved ress p C Ex

형식지정자 © 2012 생능출판사 All rights reserved

형식지정자 © 2012 생능출판사 All rights reserved

실수의 형식 © 2012 생능출판사 All rights reserved

실수의 형식 © 2012 생능출판사 All rights reserved

필드폭과 정밀도 © 2012 생능출판사 All rights reserved

필드폭과 정밀도 © 2012 생능출판사 All rights reserved

필드폭과 정밀도 © 2012 생능출판사 All rights reserved

필드폭과 정밀도 © 2012 생능출판사 All rights reserved

플래그 © 2012 생능출판사 All rights reserved

플래그 © 2012 생능출판사 All rights reserved

필드로 지정하여서 읽기 #include <stdio. h> int main(void) { int d, o, x; scanf("%d

필드로 지정하여서 읽기 #include <stdio. h> int main(void) { int d, o, x; scanf("%d %o %x", &d, &o, &x); printf("d=%d o=%d x=%dn", d, o, x); return 0; } 10 10 10 d=10 o=8 x=16 © 2012 생능출판사 All rights reserved

문자집합으로 읽기 #include <stdio. h> int main(void) { char s[80]; printf("문자열을 입력하시오: "); scanf("%[abc]",

문자집합으로 읽기 #include <stdio. h> int main(void) { char s[80]; printf("문자열을 입력하시오: "); scanf("%[abc]", s); printf("입력된 문자열=%sn", s); return 0; } 문자열을 입력하시오: abcdef 입력된 문자열=abc © 2012 생능출판사 All rights reserved

반환값 이용 #include <stdio. h> int main(void) { int x, y, z; if (scanf("%d%d%d",

반환값 이용 #include <stdio. h> int main(void) { int x, y, z; if (scanf("%d%d%d", &x, &y, &z) == 3) printf("정수들의 합은 %dn", x+y+z); else printf("입력값이 올바르지 않습니다. n"); return 0; } 10 20 30 정수들의 합은 60 abc 입력이 올바르지 않음 © 2012 생능출판사 All rights reserved

파일 모드 © 2012 생능출판사 All rights reserved

파일 모드 © 2012 생능출판사 All rights reserved

file_open. c #include <stdio. h> int main(void) { FILE *fp = NULL; fp =

file_open. c #include <stdio. h> int main(void) { FILE *fp = NULL; fp = fopen("sample. txt", "w"); if( fp == NULL ) printf("파일 열기 실패n"); else printf("파일 열기 성공n"); fclose(fp); return 0; } 파일 열기 성공 © 2012 생능출판사 All rights reserved samp le. txt

파일 닫기와 삭제 · 파일을 닫는 함수 int fclose( FILE *stream ); · 파일을

파일 닫기와 삭제 · 파일을 닫는 함수 int fclose( FILE *stream ); · 파일을 삭제하는 함수 int remove(const char *path) #include <stdio. h> int main( void ) { if( remove( "sample. txt" ) == -1 ) printf( "sample. txt를 삭제할 수 없습니다. n" ); else printf( "sample. txt를 삭제하였습니다. n" ); return 0; } © 2012 생능출판사 All rights reserved

문자 단위 입출력 · 문자 입출력 함수 파일 포인터 int fgetc( FILE *fp );

문자 단위 입출력 · 문자 입출력 함수 파일 포인터 int fgetc( FILE *fp ); int fputc( int c, FILE *fp ); F I L E · 문자열 입출력 함수 char *fgets( char *s, int n, FILE *fp ); int fputs( char *s, FILE *fp ); FILE INPUT © 2012 생능출판사 All rights reserved 문자열의 크기

문자 단위 입출력 #include <stdio. h> int main(void) { FILE *fp = NULL; fp

문자 단위 입출력 #include <stdio. h> int main(void) { FILE *fp = NULL; fp = fopen("sample. txt", "w"); if( fp == NULL ) printf("파일 열기 실패n"); else printf("파일 열기 성공n"); fputc('a', fp); fputc('b', fp); fputc('c', fp); fclose(fp); return 0; } 파일 열기 성공 © 2012 생능출판사 All rights reserved sample. txt abc

문자 단위 입출력 #include <stdio. h> int main(void) { FILE *fp = NULL; int

문자 단위 입출력 #include <stdio. h> int main(void) { FILE *fp = NULL; int c; fp = fopen("sample. txt", "r"); if( fp == NULL ) printf("파일 열기 실패n"); else printf("파일 열기 성공n"); } while((c = fgetc(fp)) != EOF ) putchar(c); fclose(fp); return 0; sample. txt abc 파일 열기 성공 abc © 2012 생능출판사 All rights reserved

문자열 단위 입출력 #include <stdio. h> #include <stdlib. h> int main(void) { FILE *fp

문자열 단위 입출력 #include <stdio. h> #include <stdlib. h> int main(void) { FILE *fp 1, *fp 2; char file 1[100], file 2[100]; char buffer[100]; printf("원본 파일 이름: "); scanf("%s", file 1); printf("복사 파일 이름: "); scanf("%s", file 2); // 첫번째 파일을 읽기 모드로 연다. if( (fp 1 = fopen(file 1, "r")) == NULL ) { fprintf(stderr, "원본 파일 %s을 열 수 없습니다. n", file 1); exit(1); © 2012 생능출판사 All rights reserved }

예제 #include <stdio. h> #include <string. h> int main(void) { FILE *fp; char fname[128];

예제 #include <stdio. h> #include <string. h> int main(void) { FILE *fp; char fname[128]; char buffer[256]; char word[256]; int line_num = 0; printf("입력 파일 이름을 입력하시오: "); scanf("%s", fname); printf("탐색할 단어를 입력하시오: "); scanf("%s", word); proverb. txt A chain is only as strong as its weakest link A change is as good as a rest A fool and his money are soon parted A friend in need is a friend indeed A good beginning makes a good ending A little knowledge is a dangerous thing © 2012 생능출판사 All rights reserved …

예제 // 파일을 읽기 모드로 연다. if( (fp = fopen(fname, "r")) == NULL )

예제 // 파일을 읽기 모드로 연다. if( (fp = fopen(fname, "r")) == NULL ) { fprintf(stderr, "파일 %s을 열 수 없습니다. n", fname); exit(1); } while( fgets(buffer, 256, fp) ) { line_num++; if( strstr(buffer, word) ) { printf("%s: %d 단어 %s이 발견되었습니다. n", fname, line_num, word ); } } fclose(fp); return 0; } 입력 파일 이름을 입력하시오: proverb. txt 탐색할 단어를 입력하시오: house proverb. txt: 7 단어 house이 발견되었습니다. proverb. txt: 8 단어 house이 발견되었습니다. © 2012 생능출판사 All rights reserved

형식화된 출력 int fprintf( FILE *fp, const char *format, . . . ); int

형식화된 출력 int fprintf( FILE *fp, const char *format, . . . ); int main(void) { int i = 23; float f = 1. 2345; FILE *fp; sample. txt 23 fp = fopen("sample. txt", "w"); if( fp != NULL ) fprintf(fp, "%10 d %16. 3 f", i, f); fclose(fp); } © 2012 생능출판사 All rights reserved %d와 같은 특정한 형식 을 지정하여 파일에 출력 할 수 있습니 다. 1. 235

형식화된 입력 int fscanf( FILE *fp, const char *format, . . . ); int

형식화된 입력 int fscanf( FILE *fp, const char *format, . . . ); int main(void) { int i; float f; FILE *fp; 100 fp = fopen("sample. txt", "r"); if( fp != NULL ) fscanf(fp, "%d %f", &i, &f); printf(“%d %f”, i, f); fclose(fp): } sample. txt 100 12. 345 © 2012 생능출판사 All rights reserved %d와 같은 특정한 형식을 지정하여 파일에 입력할 수 있습니다. 12. 345

예제 int main(void) { FILE *fp; char fname[100]; int number, count = 0; char

예제 int main(void) { FILE *fp; char fname[100]; int number, count = 0; char name[20]; float score, total = 0. 0; printf("성적 파일 이름을 입력하시오: "); scanf("%s", fname); // 성적 파일을 쓰기 모드로 연다. if( (fp = fopen(fname, "w")) == NULL ) { fprintf(stderr, "성적 파일 %s을 열 수 없습니다. n", fname); exit(1); } © 2012 생능출판사 All rights reserved

이진 파일 쓰기 size_t fwrite( void *buffer, © 2012 생능출판사 All rights reserved size_t

이진 파일 쓰기 size_t fwrite( void *buffer, © 2012 생능출판사 All rights reserved size_t size, size_t count, FILE *fp);

이진 파일 쓰기 #include <stdio. h> int main(void) { int buffer[] = { 10,

이진 파일 쓰기 #include <stdio. h> int main(void) { int buffer[] = { 10, 20, 30, 40, 50 }; FILE *fp = NULL; size_t i, size, count; buffer fp = fopen("binary. bin", "wb"); if( fp == NULL ) { fprintf(stderr, "binary. txt 파일을 열 수 없습니다. "); exit(1); } size = sizeof(buffer[0]); count = sizeof(buffer) / sizeof(buffer[0]); } i = fwrite(&buffer, size, count, fp); return 0; © 2012 생능출판사 All rights reserved count 항목 size

이진 파일 읽기 size_t fread( void *buffer, size_t size, size_t count, FILE *fp );

이진 파일 읽기 size_t fread( void *buffer, size_t size, size_t count, FILE *fp ); © 2012 생능출판사 All rights reserved

이진 파일 읽기 #include <stdio. h> #define SIZE 1000 count int main(void) { float

이진 파일 읽기 #include <stdio. h> #define SIZE 1000 count int main(void) { float buffer[SIZE]; FILE *fp = NULL; size_t size; 항목 buffer fp = fopen("binary. txt", "rb"); if( fp == NULL ) { fprintf(stderr, "binary. txt 파일을 열 수 없습니다. "); exit(1); } size = fread( &buffer, sizeof(float), SIZE, fp); if( size != SIZE ) fprintf(stderr, "읽기 동작 중 오류가 발생했습니다. n"); fclose(fp); return 0; } © 2012 생능출판사 All rights reserved size

예제 #define SIZE 3 struct student { int number; char name[20]; double gpa; };

예제 #define SIZE 3 struct student { int number; char name[20]; double gpa; }; // 학번 // 이름 // 평점 int main(void) { struct student table[SIZE] = { { 1, "Kim", 3. 99 }, { 2, "Min", 2. 68 }, { 3, "Lee", 4. 01 } }; struct student s; FILE *fp = NULL; int i; // 이진 파일을 쓰기 모드로 연다. if( (fp = fopen("student. dat", "wb")) == NULL ) { fprintf(stderr, "출력을 위한 파일을 열 수 없습니다. n"); exit(1); } © 2012 생능출판사 All rights reserved

예제 // 배열을 파일에 저장한다. fwrite(table, sizeof(struct student), SIZE, fp); fclose(fp); // 이진 파일을

예제 // 배열을 파일에 저장한다. fwrite(table, sizeof(struct student), SIZE, fp); fclose(fp); // 이진 파일을 읽기 모드로 연다. if( (fp = fopen("student. dat", "rb")) == NULL ) { fprintf(stderr, "입력을 위한 파일을 열 수 없습니다. n"); exit(1); } for(i = 0; i < SIZE; i++) { fread(&s, sizeof(struct student), 1, fp); printf("학번 = %d, 이름 = %s, 평점 = %fn", s. number, s. name, s. gpa); } fclose(fp); return 0; } 학번 = 1, 이름 = Kim, 평점 = 3. 990000 학번 = 2, 이름 = Min, 평점 = 2. 680000 학번 = 3, 이름 = Lee, 평점 = 4. 010000 © 2012 생능출판사 All rights reserved

예제 #include <stdio. h> #include <stdlib. h> int main(void) { FILE *fp 1, *fp

예제 #include <stdio. h> #include <stdlib. h> int main(void) { FILE *fp 1, *fp 2; char file 1[100], file 2[100]; char buffer[1024]; int count; printf("첫번째 파일 이름: "); scanf("%s", file 1); printf("두번째 파일 이름: "); scanf("%s", file 2); // 첫번째 파일을 쓰기 모드로 연다. if( (fp 1 = fopen(file 1, "rb")) == NULL ) { fprintf(stderr, "입력을 위한 파일을 열 수 없습니다. n"); exit(1); } © 2012 생능출판사 All rights reserved

예제 // 두번째 파일을 추가 모드로 연다. if( (fp 2 = fopen(file 2, "ab"))

예제 // 두번째 파일을 추가 모드로 연다. if( (fp 2 = fopen(file 2, "ab")) == NULL ) { fprintf(stderr, "추가를 위한 파일을 열 수 없습니다. n"); exit(1); } // 첫번째 파일을 두번째 파일 끝에 추가한다. while((count = fread(buffer, sizeof(char), 1024, fp 1)) > 0) { fwrite(buffer, sizeof(char), count, fp 2); } fclose(fp 1); fclose(fp 2); return 0; } 첫번째 파일 이름: a. dat 두번째 파일 이름: b. dat © 2012 생능출판사 All rights reserved

예제 · 다음과 같이 이진 파일의 내용을 16진수로 표시하는 프로그램을 작 성하여 보자. 흔히

예제 · 다음과 같이 이진 파일의 내용을 16진수로 표시하는 프로그램을 작 성하여 보자. 흔히 이런 형식의 화면은 디버거에서 볼 수 있다. 0000: 00000010: 00000020: 00000030: 3 C 68 74 6 D 6 C 3 E 0 D 0 A 3 C 62 6 F 64 79 3 E 0 D 0 A <html>. . <body>. . 3 C 70 72 65 3 E 0 D 0 A 3 C 68 31 3 E 42 75 69 6 C 64 <pre>. . <h 1>Build 20 4 C 6 F 67 3 C 2 F 68 31 3 E 0 D 0 A 3 C 68 33 3 E 0 D Log</h 1>. . <h 3>. 0 A 2 D 2 D 2 D 2 D. -------- © 2012 생능출판사 All rights reserved

예제 #include <stdio. h> #include <ctype. h> #include <stdlib. h> int main(void) { FILE

예제 #include <stdio. h> #include <ctype. h> #include <stdlib. h> int main(void) { FILE *fp; char fname[100]; unsigned char buffer[16]; int address = 0; int i, bytes; printf("원본 파일 이름: "); scanf("%s", fname); if( (fp = fopen(fname, "rb")) == NULL ) { fprintf(stderr, "원본 파일 %s을 열 수 없습니다. n", fname); exit(1); } © 2012 생능출판사 All rights reserved

예제 while(1) { bytes = fread(buffer, 1, 16, fp); if( bytes <= 0 )

예제 while(1) { bytes = fread(buffer, 1, 16, fp); if( bytes <= 0 ) break; printf("%08 X: ", address); for(i = 0; i < bytes; i++) printf("%02 X ", buffer[i]); for(i = 0; i < bytes; i++) if( isprint(buffer[i]) ) putchar(buffer[i]); else putchar('. '); address += bytes; putchar('n'); } fclose(fp); return 0; } © 2012 생능출판사 All rights reserved

임의 접근 관련 함수 int fseek(FILE *fp, long offset, int origin); 상수 값 설명

임의 접근 관련 함수 int fseek(FILE *fp, long offset, int origin); 상수 값 설명 SEEK_SET 0 파일의 시작 SEEK_CUR 1 현재 위치 SEEK_END 2 파일의 끝 fseek(fp, 0 L, SEEK_SET); // 파일의 처음으로 이동 fseek(fp, 0 L, SEEK_END); // 파일의 끝으로 이동 fseek(fp, 100 L, SEEK_SET); // 파일의 처음에서 100바이트 이동 fseek(fp, 50 L, SEEK_CUR); // 현재 위치에서 50바이트 이동 fseek(fp, -20 L, SEEK_END); // 파일의 끝에서 20바이트 앞으로 이동 fseek(fp, sizeof(struct element), SEEK_SET); © 2012 생능출판사 All rights reserved // 구조체만큼 앞으로 이동

예제 #include <stdio. h> #include <stdlib. h> #define SIZE 1000 void init_table(int table[], int

예제 #include <stdio. h> #include <stdlib. h> #define SIZE 1000 void init_table(int table[], int size); int main(void) { int table[SIZE]; int n, data; long pos; FILE *fp = NULL; // 배열을 초기화한다. init_table(table, SIZE); // 이진 파일을 쓰기 모드로 연다. if( (fp = fopen("sample. dat", "wb")) == NULL ) { fprintf(stderr, "출력을 위한 파일을 열 수 없습니다. n"); exit(1); } © 2012 생능출판사 All rights reserved

예제 #include <stdio. h> #include <string. h> #define SIZE 100 typedef struct person {

예제 #include <stdio. h> #include <string. h> #define SIZE 100 typedef struct person { char name[SIZE]; char address[SIZE]; // 주소 char mobilephone[SIZE]; char desc[SIZE]; } PERSON; void menu(); PERSON get_record(); void print_record(PERSON data); void add_record(FILE *fp); void search_record(FILE *fp); void update_record(FILE *fp); © 2012 생능출판사 All rights reserved // 연락처를 구조체로 표현한다. // 이름 // 휴대폰 // 특징

int main(void) { FILE *fp; int select; // 이진 파일을 추가 모드로 오픈한다. if(

int main(void) { FILE *fp; int select; // 이진 파일을 추가 모드로 오픈한다. if( (fp = fopen("address. dat", "a+")) == NULL ) { fprintf(stderr, "입력을 위한 파일을 열 수 없습니다); exit(1); } while(1) { menu(); // 메뉴를 표시한다 printf("정수값을 입력하시오: "); // 사용자로부터 정수를 받는다 scanf("%d", &select); switch(select) { case 1: add_record(fp); break; // 데이터를 추가한다 case 2: update_record(fp); break; // 데이터를 수정한다 case 3: search_record(fp); break; // 데이터를 탐색한다 case 4: return 0; } } fclose(fp); // 이진 파일을 닫는다 return 0; } 예제 © 2012 생능출판사 All rights reserved

// 사용자로부터 데이터를 받아서 PERSON get_record() { PERSON data; fflush(stdin); printf("이름); printf("주소); printf("휴대폰); 구조체로

// 사용자로부터 데이터를 받아서 PERSON get_record() { PERSON data; fflush(stdin); printf("이름); printf("주소); printf("휴대폰); 구조체로 반환한다 예제 // 표준 입력의 버퍼를 비운다 gets(data. name); // 이름을 입력받는다 gets(data. address); // 주소를 입력받는다 gets(data. mobilephone); // 휴대폰 번호를 입력받 는다 printf("특징); return data; gets(data. desc); } // 구조체 데이터를 화면에 출력한다. void print_record(PERSON data) { printf("이름n", data. name); printf("휴대폰n", data. mobilephone); } © 2012 생능출판사 All rights reserved // 특징을 입력 받는다 printf("주소n", data. address); printf("특징n", data. desc);

Q&A © 2012 생능출판사 All rights reserved

Q&A © 2012 생능출판사 All rights reserved