파일 입출력 2번 째 글이다. 이번엔 텍스트 파일에 데이터를 읽고 쓰는 것에 대해 다룰 예정이다.
int fprintf(FILE *stream, const char *format [, argument]...);
함수 사용 형식 : fprintf(파일 포인터, 파일에 입력할 문자열 형식, 출력할 값들);
ex:
fprintf(p_file, "hallo\n"); 파일에 hallo 문자열을 쓰고 줄 바꿈을 한다.
#include <stdio.h>
int main()
{
FILE* p_file = fopen("파일입출력.txt", "wt");
if (NULL != p_file)
{
fprintf(p_file, "hello\n");
fclose(p_file);
}
}
텍스트 파일에서 문자열 읽기 : fscanf 함수
함수 원형 : int fscanf(FILE stream, const char format[, argument]...)
함수 사용 형식 : fscanf(파일 포인터, 파일에서 데이터를 입력 받을 형식, 입력 받을 변수 목록)
ex:
int data;
fscanf(p_file, "%d", &data);
텍스트 파일에서 한 줄 단위로 문자열 읽기 : fgest 함수
함수 원형 : char *fgets(char *stirng, int n, FILE *stream);
함수 사용 형식 : fgets(파일에서 읽은 문자열을 저장할 메모리의 주소, 첫 번째 매개변수로 사용한 메모리의 크기, 파일 포인터);
ex :
char temp[54];
fgets(temp, sizeof(temp), p_file);
void main()
{
char temp[64];
FILE* p_file = fopen("파일입출력.txt", "rt");
if (NULL != p_file)
{
while (NULL != fgets(temp, sizeof(temp), p_file))
{
printf("%s", temp);
}
fclose(p_file);
}
}
바이너리 파일에 데이터 읽고 쓰기
바이너리 파일에 데이터 저장하기 : fwrite 함수
<함수 원형>
size_t fwrite(const void *butter, size_t size, size_t count, FILE *stream);
<사용 형식>
fwrite(저장할 데이터의 시작주소, 저장할 데이터의 기준 단위 크기, 반복 횟수, 파일 포인터)
예를 들어 : int형 변수 data에 저장되어 있는 16진수 값을 파일에 저장하고 싶으면 이와 같이 하면된다.
int data = 0x00000412;
fwrite(&data, sizeof(int), i, p_file)
<fwrite 함수로 바이너리 파일에 int형 변수 값 저장하기>
#include <stdio.h>
void main()
{
int data = 0x0000012;
FILE* p_file = fopen("파일입출력.dat", "Wb");
fwrite(data, sizeof(int), 1, p_file); //여기서 data의 의미는 &data[0] 시작주소를 의미한다.
// 세 번째 매개변수는 주로 반복횟수를 의미한다.
// fwrite(data, sizeof(int) * 5, 1, p_file); sizeof는-단위크기 // 1은 반복횟수다.
fclose(p_file);
}
#include <stdio.h>
void main()
{
int data = 100, data_list[5] = { 0,1,2,3,4 };
FILE* p_file = fopen("파일입출력.dat", "wb");
if (NULL != p_file)
{
fwrite(&data, sizeof(int), 1, p_file);
fwrite(data_list, sizeof(int), 5, p_file);
fclose(p_file);
}
}
바이너리 파일에서 데이터 읽기 : fread 함수
<함수 원형>
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
<사용 형식>
fread(읽은 데이터를 저장할 주소, 저장할 데이터의 기준 단위 크기, 반복 횟수, 파일 포인터);
예를 들어 파일에 저장되어 있는 데이터를 읽어서 int형 변수 data에 저장하고 싶으면 다음과 같이 구성한다.
int data;
fread(&data, sizeof(int), 1, p_file);
//p_file이 가리키는 파일에서 4바이트 크기만큼 1회만 데이터를 읽어 와서 data 변수에 저장한다.
<fread 함수로 바이너리 파일의 첫 4바이트 값 읽어오기.>
void main()
{
int data;
FILE* p_file = fopen("파일입출력.dat", "rb");
if (NULL != p_file)
{
fread(&data, sizeof(int), 1, p_file);
//읽기모드로 파일을 열면, 파일의 처음 위치 부터 데이터를 읽을 수 있다.
//파일의 첫 4바이트만큼 읽어와서 data의 시작주소에 넣는다.
fclose(p_file);
printf("file data : %d(0x%04x)\n", data, data);
}
}
<결과>
int data[5];
fread(data, sizeof(int), 5, p_file); //4바이트 단위로 5회 반복해서 데이터를 읽어온다.
※주의
if(5 == fread (&data, sizeof(int), 5, p_file); //5==5같아야한다.
파일 내부의 작업 위치 탐색, 확인 > fseek, ftell 함수
함수 원형
int fseek(FILE *stream, long offset, int origin);
함수 사용 형식
fseek(파일 포인터, 이동 거리, 기준 위치);
fseek(p_file, 0, SEEK_SET);
fseek(p_file, 32, SEEK_CUR); //현재 위치에서 32만큼 뒤로이동
이동한 위치를 값으로 나타내는 함수가 ===> ftell 함수다.
ftell
<함수 원형>
long ftell(FILE *stream);
<함수 사용 형식>
현재 열려 있는 파일 내에서 데이터를 읽거나 저장할 위치 = ftell(파일 포인터);
void main()
{
int file_size = 0;
FILE* p_file = fopen("파일입출력.dat", "rb"); //읽기 모드로 바이너리 파일을 오픈했다/
if (NULL != p_file) // 파일 열기에 성공한 경우
{
fseek(p_file, 0, SEEK_END); //파일의 끝으로 이동해라
file_size = ftell(p_file); // 현재 파일 위치로 파일의 크기를 구했다.
printf("파일 크기 : %d\n", file_size);
fclose(p_file);
}
}
fopen : 파일(스트림 열기)
fclose : 파일 닫기 :
fgetc : 파일에서 문자 읽기
fputc : 파일에 문자 출력
fgets : 파일에서 문자열 읽기
fputs : 파일에 문자열 출력
fscanf : 서식 데이터 입력
fprintf : 데이터 서식 파일 출력
fread : 파일 이진 자료 입력
fwrite : 파일 이진 자료 출력
fseek : 파일 임의 접근
ftell : 파일 현재 위치
rewind : 파일 포인터 재설정
feof : 파일 상태 파악
ferror : 파일 오류 확인
fflush : 출력버퍼를 파일에 기록