파일 입출력의 기본 구조는
1. 파일 오픈
2. 파일 읽기/쓰기
3. 파일 닫기
이렇게 되어 있습니다.
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE* fStream; //FILE 구조체 포인터 변수 선언
// 오픈한 파일의 주소를 담기 위해서
fStream = fopen("c:\\a.txt","w"); //파일이름(경로), 모드(w,r,a)읽고쓰고추가
/*파일오픈이 성공하면 해당 내용의 정보를
실패하면 NULL값이 반환된다.*/
if(fStream) //NULL이면 거짓이 된다.
{
printf("파일생성 성공\n");
}
fclose(fStream); //파일 닫기
return 0;
}
fopen() 함수의 인자 값에 대해서
처음으로 들어가는 것은 파일 이름 혹은 경로입니다.
파일 이름을 단독으로 사용한다면 상대 경로가 되며 기준은 해당 프로젝트 파일의 위치가 기준이 됩니다.
위처럼 전체 경로를 쓰게 되는 경우는 절대 경로로 작성되며 /이게 아닌 \이걸로 써야 합니다.
c:\\a.txt
뒤에 따라오는 모드에 대해서
write 쓰기 (파일이 존재하지 않으면 생성/ 파일이 있다면 내용을 덮어씀)
read 읽기
append 추가
기본값은 텍스트를 읽고 쓰고 추가하게 되어있습니다.
바이너리 모드로 설정할 수 있습니다.
바이너리는 데이터의 2진수 표현입니다.
wb
rb
ab
뒤에 b를 붙여 주면 됩니다.
데이터 쓰기
#include <stdio.h>
#include <string.h> //strlen함수 사용
int main(int argc, char const *argv[])
{
FILE* fStream;
fStream = fopen("c:\\a.txt","w");
if(fStream)
{
fwrite("abcdefg",strlen("abcdefg"), 1, fStream);
}
fclose(fStream);
return 0;
}
fwrite() 함수에 대하여
인자는 총 4개 필요(순서대로)
1. 쓸 데이터의 주소
2. 입력할 내용의 크기
3. 몇 번 반복할 것인가
4. 정보를 쓸 FILE 구조체 포인터 변수
쓸 데이터의 주소에 문자열이 들어가 있습니다.
문자열은 기본적으로 포인터(배열) 즉 주소를 참조합니다.
아니면 다음과 같이
char a[7]={'a','b','c','d','e','f','g'};
fwrite(a,strlen("abcdefg"), 1, fStream);
이렇게 해도 무방하겠죠
또는(주소라는 개념을 위해)
char a = 'a';
fwrite(&num, sizeof(a), 1, fStream); //주소연산자 확인
이렇게 할 수도 있습니다.
두 번째 인자인 입력할 데이터의 크기에 대하여
바이트 기준으로 값을 넣을 수 있습니다.
그러나 일반적으로 함수를 이용해 해당 변수의 사이즈를 확인합니다.
sizeof() 변수의 크기
strlen() 문자열 길이
물론 숫자를 쓸 수도 있습니다.
데이터 읽기
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE* fStream;
char szData[50] = {0};
fStream = fopen("c:\\a.txt","r"); //읽기모드
if(fStream)
{
fread(szData, 50, 1, fStream);
printf("szData : %s\n", szData);
}
fclose(fStream);
return 0;
}
fread() 함수에 대해서
인자는 총 4개 필요
1. 읽어와 담을 공간의 주소
2. 담을 공간의 사이즈
3. 몇 번 반복할 것인가
4. 정보를 읽어올 FILE 구조체 포인터 변수
위의 인자는 fwrite() 함수와 비슷한 구조를 갖고 있습니다.
만약에 a.txt에 abcdefg를 입력하고 저장해둔 파일이 있을 때
a.txt를 읽어와서
b.txt에 복사를 하려고 한다면
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
FILE* fStream1, * fStream2;
char szData[50] = { 0 };
fStream1 = fopen("a.txt", "r");
fStream2 = fopen("b.txt", "w");
if (fStream1 && fStream2)
{
fread(szData, 50, 1, fStream1);
fwrite(szData, strlen(szData), 1, fStream2);
}
fclose(fStream1);
fclose(fStream2);
return 0;
}
그 외 파일 처리 함수
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE* fin, * fout;
char buffer[30] = {0};
char one;
fin = fopen("c:\\a.txt","r");
fout = fopen("c:\\b.txt","w");
if(fin && fout)
{
/*
아래내용 들어갈 자리
*/
}
fclose(fin);
fclose(fout);
return 0;
}
(* 위의 소스 코드에서 아래 내용 들어갈 자리에 삽입되는 함수들입니다.)
fgetc()
필요한 인자 개수 1개
1. 읽어 올 FILE 구조체 포인터 변수
fputc()
필요한 인자 개수 2개
1. 저장할 변수
2. 쓸 FILE 구조체 포인터 변수
// fgetc fputc // 단일문자 입출력 함수
one = fgetc(fin); //fin으로부터 1글자 가져와서 one에 저장
fputc(one,fout); //저장된 one으로부터 한글자를 fout에 쓰기
fgets()
필요한 인자 개수 3개
1. 내용을 저장할 주소
2. 저장할 사이즈
3. 읽어 올 FILE 구조체 포인터 변수
fputs()
필요한 인자 개수 2개
1. 저장할 내용이 있는 주소
2. 쓸 FILE 구조체 포인터 변수
// fgets fputs //문자열 입출력 함수
fgets(buffer, sizeof(buffer), fin); //fin으로부터 가져온 문자열을 buffer에 저장
fputs(buffer, fout);//저장된 buffer의 내용을 fout에 쓰기
fscanf()
최소 필요한 인자 개수 3개(가변 인자)
1. 읽어 올 FILE 구조체 포인터 변수
2. 포맷 형식(서식 문자)
3. 저장할 공간
fprintf()
최소 필요한 인자 개수 3개(가변 인자)
1. 쓸 FILE 구조체 포인터 변수
2. 포맷 형식(서식 문자)
3. 저장할 내용이 있는 변수
//fscanf fprintf //서식화 파일 입출력 함수
fscanf(fin, "%s",buffer); //fin으로부터 buffer에 입력 받음(읽어옴)
fprintf(fout,"%s",buffer);//저장된 buffer의 내용을 fout에 쓰기
'컴퓨터 프로그래밍 > C' 카테고리의 다른 글
C언어 Call by Value / Call by Address (0) | 2019.07.23 |
---|---|
C언어 함수 (0) | 2019.07.23 |
C언어 구조체 (구조체 포인터 / typedef) (0) | 2019.07.23 |
C언어 변수 (지역/전역변수) (0) | 2019.07.23 |
C언어 rand() srand() time() 함수 (난수 생성) (0) | 2019.07.23 |