22/01/12
1. fgets(), fputs()
1. fgets()
- 형태 :
fgets(char* str, int num, FILE * stream); - 파일 스트림에서 (num-1)만큼의 문자열을 받아 str에 저장하는 함수
- 파일 끝을 읽거나 오류 발생 시
return NULL - ex)
1
2
3
4
5
6
7
8
9
10
11
char c[80];
fp = fopen("test.txt", "r"); // 파일 읽기 전용 열기
if(fp == NULL) // 파일에 오류 발생 시
perror("파일 여는 것을 실패했습니다."); // 오류메세지 출력 : 발생한 에러 메세지
else {
fgets(c, 80, fp); // fp의 내용을 크기 80까지 읽어오고 c에 내용 저장
puts(c); // 모니터에 문자열 c 출력
}
fclose(fp); // 사용 끝난 후 파일 닫기
- test.txt 존재 시(내용 : hello, world)
- 결과 : hello, world
- test.txt 미 존재 시
- 결과 : 파일 여는 것을 실패했습니다. : 에러 메세지
![perror]()
2. fputs()
- 형태 :
fputs(char* str, FILE * stream); - 파일 스트림에 str 입력
- 오류 시
return EOF - ex)
1
2
3
4
5
6
7
8
char c[80];
fgets(c, 80, stdin); // 키보드(stdin)의 내용을 크기 80까지 읽어오고 c에 내용 저장
fp = fopen("test.txt", "w"); // 파일 쓰기 전용 열기(파일 없으면 새로 생성)
fputs(c, fp); // fp에 c의 내용 입력
fclose(fp);
- 결과 : fgets()로 사용자에게 입력받은 문자열이 fp에 추가됨
2. fgets() vs gets(), fputs() vs puts()
fgets(), gets()
- fgets() : \n 추가
- gets() : \0 추가
함수 abc\n(문자열 얻기) fgets() abc\n\0 gets() abc\0 - ex) test.txt내용 : hello, world
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char c[] = "bye, world";
// fgets()
printf("fgets()\n");
fgets(c, 80, stdin);
fp = fopen("test.txt", "w");
fputs(c, fp);
fclose(fp);
printf("\n");
// gets()
printf("gets()\n");
gets(c);
fp = fopen("test.txt", "w");
fputs(c, fp);
fclose(fp);
- 결과
fgets()
hello, world
bye, worldgets()
hello, worldbye,world
fputs(), puts()
- fputs() : fp에 문자열 입력, \n없음
- puts() : 모니터에 문자열 출력
함수 abc\0 fputs() abc puts() abc\n - ex)
1
2
3
4
5
fputs("hello1", stdout); // stdout : 모니터
fputs("bye1", stdout);
printf("\n");
puts("hello2");
puts("bye2");
- 결과
hello1bye1
hello2
bye2
3. I/O 함수
1. int fseek(fp, offset, origin);
- 파일(fp)의 어디서부터(origin) 몇 번째(long int offset)에 커서를 옮기는 함수
- origin 종류
모드 값 파일에서의 위치 SEEK_SET 0 파일의 시작(처음) SEEK_CUR 1 현재 위치 SEEK_END 2 파일의 끝
- ex)
test.txt 내용 : 123456789abcdef
1
2
3
4
5
6
7
8
9
10
11
char c[80];
fp = fopen("test.txt", "r"); // 파일 읽기 모드 열기
fgets(c, 80, fp);
puts(c);
fseek(fp, 7, SEEK_SET); // 커서를 파일의 처음에서 7번째로 이동
fgets(c, 80, fp);
puts(c);
fclose(fp);
- 결과
1 2
123456789abcdef //fseek 사용 전 89abcdef // fseek 사용 후
- fseek(fp, -4, SEEK_END); >> 파일의 끝에서 왼쪽으로 네 번 커서 이동
- ’-‘부호는 커서가 왼쪽으로 이동
- 양수는 커서가 오른쪽으로 이동
2. int ftell(fp);
- 현재 커서의 위치 반환
- ex)
1
2
3
4
fp = fopen("test.txt", "r");
fseek(fp, 2, 0); // 0,1,2로도 origin을 설정할 수 있음
printf("현재 커서 위치 = %d",ftell(fp));
- 결과 : 현재 커서 위치 = 2
- 전체를 다 읽고(puts(), fputs()) 사용하면 끝의 커서 위치 반환
3. int fflush(fp);
- buffer에 출력되지 않은 데이터들을 모조리 출력해 buffer를 비우는 함수
4. int setvbuf(fp, char *buf, int mode, size_t size);
- 원래 있는 버퍼가 아닌 다른 버퍼를 사용하는 함수
- 많이 사용하지 않는다고 한다.
- 파일(fp)을 어떤 모드(mode)의 크기가 size(버퍼 크기)인 다른 버퍼(*buf)를 사용한다.
- mode : 버퍼의 모드 설정
- _IOFBF : Full buffer >> 버퍼가 가득차면 출력
- _IOLBF : Line buffer >> \n을 기준이로 출력
- _IONOBUF : No buffer >> 버퍼 미사용(바로바로 출력)
5. freopen(fileName, mode, fp);
- 파일을 닫았다가 사용하는 것이 아닌 사용중에 다시 여는 함수
- 사용하는 파일(fileName)과 같은 파일(fp)에 어떠한 모드(mode)로 다시 열것인가?
1 2
fp = fopen("test.txt", "w"); // 쓰기모드로 열기 fp = freopen("test.txt", "r", fp); // 읽기모드로 다시 열기
- 사용하는 파일(fileName)과 같은 파일(fp)에 어떠한 모드(mode)로 다시 열것인가?
- 사용하는 파일(fileName)과 다른 파일(fp)에 어떠한 모드(mode)로 다시 열것인가?
1 2 3 4
fp = fopen("test.txt", "w"); // 쓰기모드로 열기 fp = freopen("test.txt", "w", stdout); // 모니터로 쓰기모드 재오픈 printf("abcd"); // 모니터에 프린트된 'abcd'가 test.txt에 입력됨 fclose(fp);

Comments powered by Disqus.