Computer Science/C\C++

[C언어] 파일 입출력

hyunjin 2021. 6. 2. 20:53

스트림(Stream)

  • 프로그램과 파일 사이에 데이터가 이동할 수 있는 다리
  • 1바이트(byte) 단위로 저장
  • 파일이 필요한 이유: 하드디스크에 파일 형태로 저장해야 전원 꺼져도 데이터가 보존

 

파일

  • C에서의 파일은 일려의 연속된 바이트
  • 파일열기->파일 읽기와 쓰기->파일 닫기

fopen 함수

스트림 형성할때 호출하는 함수

#include <stdio.h>
FILE * fopen(const char * filename, const char * mode)

FILE<-구조체 변수

 

파일모드

"r" : 읽기모드

"w" : 쓰기모드, 이미 존재하면 기존 내용이 지워짐

"a" : 추가모드, update모드

"r+" : 읽기모드, 쓰기 모드로 전환 가능

"w+" : 쓰기모드, 읽기모드로 전환 가능

"a+: : 추가모드, 읽기모드로 전환 가능

"t" : 텍스트 파일 모드(문자열)

"b" : 이진 파일 모드 

 

기본적인 파일모드

"r", "w", "a"

 

FILE 구조체

파일을 가리키는 참조자의 역할

 

fputc 사용

int main(void)
{
	FILE * fp=fopen("data.txt", "wt");
	if(fp==NULL)
	{
		puts("파일 오픈 실패!");
		return -1;
	}
	fputc('A', fp);
	fputc('B', fp);
	fputc('C', fp);
    
	fclose(fp);
	return 0;
}

->파일에 ABC 쓰여있을 것!

 

fclose 해야하는 이유

스트림 형성 위해 시스템 자원을 할당

안닫아주면 자원 손실

 

메모리버퍼(여분의 메모리 확보)를 이용함

버퍼링 방식에 따라 뒤늦게 파일에 저장됨

 

문자 A,B가 버퍼에 존재하는 상태에서 전원이 꺼지면 저장이 안됨

fclose를 해야 버퍼를 파일에 저장시키고 버퍼가 비게된다.

 

fflush함수

스트림을 종료하지 않고 버퍼를 비우는 함수

 

문자의 입출력: fgetc, fputc

 

파일의 끝을 확인하는 방법: feof

정상적으로 끝에 도달해서 EOF에 반환된것이면 feof함수는 0이 아닌 값을 반환

오류가 발생했을 때 feof 함수는 0반환

 

문자열의 입력: fgets

ex)  fgets(buf ,100, fp); // fp는 FILE 구조체 포인터

 

문자열의 출력: fputs

ex)  fputs(but,fp);

 

서식에 따른 데이터 출력: fprintf

하나의 파일에 출력할 데이터가 텍스트 데이터와 바이너리 데이터 둘로 이뤄져 있는 ㄱㅇ우에 사용되는 함수

출력의 대상이 콘솔이 아닌 파일

ex)  fprintf(fp, "%s %c %d", name, &sex, &age);

 

서식에 따른 데이터 입력: fscanf

 

텍스트 파일과 이진 파일의 차이점

텍스트파일 : 모든 데이터가 아스키코드로 변환되어 저장->표준화 되어있음,호환성 보장, 매핑 필요함, 이해하기 쉬움

이진 파일 : 컴퓨터에서 데이터를 표현하는 방식 그대로 저장->독립성 보장X, 좀 더 빠름

 

이진파일쓰기 : fwrite()함수

fwrite(buffer, sizeof(int), SIZE, fp);

 

이진파일 읽기: fread()