본문 바로가기

C++

C 파일입출력

C언어의에서 파일 입출력 함수

 

출력함수(입력)

errno_t : 스트림 개방 성공 시 0, 실패 시 이유에 따른 값을 반환

fopen_s(FILE** _Stream, const char* _FileName, const char* _Mode) : 스트림 개방 함수 해당 파일을 읽어 오는 함수

FILE** _Stream : 스트림을 저장할 변수의 주소를 전달한다!
-> 내부에서 동적할당해주기 때문에 이중 포인터를 사용한다.
const char* _FileName : 경로와 파일 이름, 확장자까지 전달한다.

const char* _Mode : 읽기/쓰기, Text형식/Binary형식 인지 전달한다.

fclose(FILE* _Stream) : 스트림 소멸 함수

 

	FILE*		fp = nullptr;

	////// 절대 경로
	errno_t err = fopen_s(&fp, "C:\Users\ehddl\OneDrive\바탕 화면\File\Text.txt", "wt");

	//// 상대 경로
	errno_t err = fopen_s(&fp, "../Text.txt", "wt");

	if (0 == err)
	{
		fputc('A', fp);
		fputc('B', fp);

		cout << "스트림 개방 성공" << endl;
		fclose(fp);
	}
	else
	{
		cout << "스트림 개방 실패" << endl;
	}

FILE* fp = nullptr 은 파일의 스트림을 저장할 변수이다.

fopen_s의 첫번째 인자로 파일의 스트림 저장 변수의 주소값을 넘겨준다.

              두번째 인자는 해당 파일의 경로를 검색한다. 절대 경로와 상대경로가있다.

절대경로 : 맨 처음부터 해당파일이 있는위치의 모든것 절대 변하지 않는다.

상대경로 : 자신의 위치에서부터의 경로 해당파일을 자신의 위치에서부터 찾는다.

              세번째 인자는 해당 파일의 형식이다.

r : read mode 해당 파일을 읽기 전용으로 열것이다. 파일이 존재하지 않으면 에러 반환
w : write mode 해당 파일을 쓰기 전용으로 열것이다. 파일이 존재하지 않으면 새로 만든다.
a : append mode 해당 파일을 이어쓰기로 열것이다. 해당 파일의 뒤부터 편집한다.
파일이 존재하지 않으면 새로 만든다.
r+ : read+ mode 해당 파일을 읽기,쓰기 전용으로 열것이다. 파일이 존재하지 않으면 에러 반환
w+ : write+ mode 해당 파일을 읽,쓰기 전용으로 열것이다. 파일이 존재하지 않으면 파일 생성
a+ : append+ mode 해당 파일을 맨 끝에서 읽기,쓰기 가능하게 열것이다.
파일이 존재하지 않으면 새로 만든다.
t : text 텍스트 모드
b : binary 바이너리 모드

 

입력함수(읽기)

fgetc(FILE* _Stream) : 스트림 에서 문자 하나를 읽어온다.

인자로 전달한 stream의 파일 위치에 지정자가 가리키는 문자를 리턴한다.

읽어들인 문자는 int 값으로 리턴 만약 파일의 끝에 도달하였거나, 읽는 도중 오류가 발생하였다면 EOF를 리턴

	char chA = 0, chB = 0;
	FILE*	fp = nullptr;

	errno_t err = fopen_s(&fp, "../Text.txt", "rt");

	if (0 == err)
	{
		chA = fgetc(fp);
		chB = fgetc(fp);

		cout << "파일 개방 성공" << endl;
		fclose(fp);
	}
	else
		cout << "파일 개방 실패" << endl;

	cout << chA << ", " << chB << endl;

 

바이너리 모드의 입출력

출력(읽기)

fwrite(const void* _Buffer, size_t _ElementSize, size_t _ElementCount, FILE* _Stream)

바이너리 모드로 값을 읽어 올때 사용

const void* _Buffer : 읽은 바이너리를 담을 시작주소

size_t _ElementSize : 읽어들일 크기(byte단위)

size_t _ElementCount : 읽어들인 바이너리의 갯수

FILE* _Stream : 읽은 스트림의 주소

 

long long Arr[1483320];
	
	FILE* fp = nullptr;
	errno_t err = fopen_s(&fp, "../Text.txt", "rb");
	if (0 == err)
	{
		fread(Arr, sizeof(Arr), 1, fp);

		cout << "파일 개방 성공" << endl;
		fclose(fp);
	}
	else
		cout << "파일 개방 실패" << endl;

fread로 해당 텍스트를 바이너리로 만들어서 Arr에 저장하게된다. Arr의사이즈에 1만큼 읽어들이니

Text.txt의 파일에 1483320의 바이너리를 읽어들인다. 만약 1이 아닌 2라면 1483320*2의 갯수만큼 읽어들인다.

 

입력(쓰기)

fwritefread(const void* _Buffer, size_t _ElementSize, size_t _ElementCount, FILE* _Stream)

바이너리 모드로 값을 읽어 올때 사용

const void* _Buffer : 읽은 바이너리를 담을 시작주소

size_t _ElementSize : 읽어들일 크기(byte단위)

size_t _ElementCount : 전달할 갯수

FILE* _Stream : 읽은 스트림의 주소

 

	int Arr[5] = { 1, 2, 3, 4, 5 };	
    
    FILE* fp = nullptr; // 쓰기
	errno_t err = fopen_s(&fp, "../Temp.txt", "wb");
	if (0 == err)
	{
		fwrite(Arr, sizeof(Arr), 1, fp);

		cout << "파일 개방 성공" << endl;
		fclose(fp);
	}
	else
	{
		cout << "파일 개방 실패" << endl;
	}

Arr의 있는 값들을 해당 텍스트 파일에 바이너리로 넣는다.

Arr의 사이즈 20byte만큼 전달한다. 만약 전달하는갯수가 1이 아닌2라면 40byte를 전달한다.

 

파일의 크기알아내기

	int size = 0;
	FILE* fp = nullptr;
	errno_t err = fopen_s(&fp, "../Text.txt", "rb");
    
	if (0 == err)
	{
		fseek(fp, 0, SEEK_END);    // 파일 포인터를 파일의 끝으로 이동시킴
    		size = ftell(fp);          // 파일 포인터의 현재 위치를 얻음

		cout << "파일 개방 성공" << endl;
		fclose(fp);
	}
	else
		cout << "파일 개방 실패" << endl;

 

'C++' 카테고리의 다른 글

C++ 연산자 오버로딩 주의사항  (0) 2020.09.06
C++ 연산자 오버로딩(Operator Overloading)  (0) 2020.09.06
C++ malloc,callco,new  (0) 2020.09.01
C++ 문자열 함수  (0) 2020.08.31
C++ char*와char[]  (0) 2020.08.28