Home C언어 공부 정리(10/10)-FILE I/O
Post
Cancel

C언어 공부 정리(10/10)-FILE I/O

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, world

    gets()
    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_SET0파일의 시작(처음)
      SEEK_CUR1현재 위치
      SEEK_END2파일의 끝
  • 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);

  • 파일을 닫았다가 사용하는 것이 아닌 사용중에 다시 여는 함수
    1. 사용하는 파일(fileName)과 같은 파일(fp)에 어떠한 모드(mode)로 다시 열것인가?
      1
      2
      
      fp = fopen("test.txt", "w"); // 쓰기모드로 열기
      fp = freopen("test.txt", "r", fp); // 읽기모드로 다시 열기
      
  1. 사용하는 파일(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);
    
This post is licensed under CC BY 4.0 by the author.

C언어 공부 정리(10/10)-printf(포맷) 형태

C언어 공부 정리(10/10)-연습문제

Comments powered by Disqus.