공부 중 메모/수업 예제 (KGCA)

C언어 파일 입출력 예제

라이피 (Lypi) 2018. 6. 23. 14:36
반응형

출처 : KGCA 게임 아카데미(http://www.kgcaschool.com/). 수업 예제 파일.


1) 

#include <stdio.h>

int main()
{
	int		iValue = 50;
	float	fValue = 3.141592f;
	FILE*	fp;
	fopen_s(&fp, "demo.txt", "w");
	{
		fprintf(fp, "%s", "========= KGCA =========");
		fprintf(fp, "\n%s", "홍길동");
		fprintf(fp, " %d %f", iValue, fValue);
	}
	fclose(fp);


	iValue = 99;
	fValue = 6.26f;
	fopen_s(&fp, "demo.txt", "a");
	{
		fprintf(fp, "\n%s ", "개통이");
		fprintf(fp, "%d %f", iValue, fValue);
	}
	fclose(fp);


	char	buffer[256] = { 0, };
	int		iValueRead;
	float	fValueRead;
	FILE*	fpRead;

	fopen_s(&fpRead, "demo.txt", "r");
	{
		fgets(buffer, 256, fpRead);
		fscanf_s(fpRead, "%s %d %f", buffer, 256, &iValueRead, &fValueRead);
		printf("\n%s %d %f", buffer, iValueRead, fValueRead);
		fscanf_s(fpRead, "%s %d %f", buffer, 256, &iValueRead, &fValueRead);
		printf("\n%s %d %f", buffer, iValueRead, fValueRead);
	}
	fclose(fpRead);

	return 0;
}


2)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


//파일을 읽어들여 16진수와 문자로 출력한다.
void DrawHexAscii(char* file) 
{
	unsigned char munja[10];
	FILE* fp;
	int i, j, n = 0;

	fopen_s(&fp, file, "rb");
	if (fp == NULL)
	{
		puts("파일이 존재하지 않습니다. \n");
		return;
	}

	while (!feof(fp)) {
		printf("\n%05d : ", ftell(fp));
		for (i = 0; i < 10; i++) {
			munja[i] = fgetc(fp);
			printf("%02X", munja[i]);
			if (feof(fp)) { break; }
		}
		printf("  ");

		for (j = 0; j < i; j++) {
			if (munja[j] == '\t' || munja[j] == '\n' || munja[j] == '\r') {
				munja[j] = '.';
			}
			putchar(munja[j]);
		}
		n++;
		if (n % 20 == 0) {
			puts("\n<아무키나 누르세요>\n");
			_getch();
		}
	}
}

//파일을 로딩하여 역순으로 출력한다.

void DrawInverse(char* file)
{
	FILE* fp;

	fopen_s(&fp, file, "rb");
	if (fp == NULL)
	{
		puts("파일이 존재하지 않습니다. \n");
		return;
	}

	fseek(fp, 0, SEEK_END);
	int iSize = ftell(fp);
	printf("%d 바이트입니다.\n", iSize);
	fseek(fp, 0, SEEK_SET);

	int n = 0;

	do {
		char* munja = 0;
		munja = (char*)calloc(256, sizeof(char));

		int i, j;

		for (i = 0; i < 256; i++) {
			if (!feof(fp)) {
				munja[i] = fgetc(fp);
			}
			else {
				free(munja);
				return;
			}

			//int iCnt = fseek(fp, 2, SEEK_CUR);
			if (munja[i] == '\n' || ftell(fp) <= 0) {
				break;
			}
		}
		for (j = i; j > 0; j--) {
			putchar(munja[j]);
		}
		n++;
		free(munja);

		if (n % 20 == 0) {
			puts("\n<아무키나 누르세요>\n");
			_getch();
		}

	} while (!feof(fp));
}

int main(int argc, char* argv[])
{
	if (argc != 3) {
		printf("\n 사용법 : fileIO_1.exe FilePath 0(inverse) or 1(Hex) \n");
		return 0;
	}

	int iValue = atoi(argv[2]);
	if (iValue == 1) {
		DrawHexAscii(argv[1]);
	}
	else {
		DrawInverse(argv[1]);
	}

}


3)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

//자기 참조 구조체 (연결리스트), 구조체
typedef struct TNodeData
{
	char		m_strName[20];
	int			m_iAge;
	char		m_strAddress[50];
	TNodeData*	pNext;
}TNode;

char*	GetName(TNode* pNode, int iIndex) { return pNode[iIndex].m_strName; }
int		GetAge(TNode* pNode, int iIndex) { return pNode[iIndex].m_iAge; }
char*	GetAddress(TNode* pNode, int iIndex) { return pNode[iIndex].m_strAddress; }

//블록단위 입출력
int main()
{
	FILE*	fp_src;
	FILE*	fp_dest;
	char	buff[4096];
	size_t	n_size;

	fopen_s(&fp_src, "FileIO_2.cpp", "r");
	fopen_s(&fp_dest, "FileIO_2.bak", "w");

	while (0 < (n_size = fread(buff, 1, 4096, fp_src))) {
		fwrite(buff, 1, n_size, fp_dest);
	}

	fclose(fp_src);
	fclose(fp_dest);

	//텍스트 파일 블록단위 출력
	TNode List[3] = {
		{ "홍길동", 24, "서울" },
		{ "김정일", 44, "대전" },
		{ "나그네", 54, "부산" }
	};

	fopen_s(&fp_dest, "BolckRead.dat", "w");
	fwrite(List, 1, sizeof(TNode) * 3, fp_dest);
	fclose(fp_dest);

	//텍스트 파일 블록단위 입력
	TNode Load[3];
	fopen_s(&fp_src, "BolckRead.dat", "r");
	fread(Load, 1, sizeof(TNode) * 3, fp_src);
	fclose(fp_src);

	//텍스트 파일 라인 출력
	fopen_s(&fp_dest, "LineWrite.txt", "wt");
	for (int iCnt = 0; iCnt < 3; iCnt++) {
		fprintf(fp_dest, "\n%s %d %s",
			GetName(List, iCnt),
			GetAge(List, iCnt),
			GetAddress(List, iCnt));
	}
	fclose(fp_dest);

	//텍스트 파일 라인 입력
	TNode	LineBuffer[3];
	char	pBuffer[256];
	int		iCount = 0;

	fopen_s(&fp_src, "LineWrite.txt", "rt");
	fgets(pBuffer, 256, fp_src);
	while (!feof(fp_src)) {
		fgets(pBuffer, 256, fp_src);
		sscanf_s(pBuffer, "%s %d %s", 
			LineBuffer[iCount].m_strName, 20,
			&LineBuffer[iCount].m_iAge,
			LineBuffer[iCount].m_strAddress, 50);
		iCount++;
	}
	fclose(fp_src);

	return 0;
}


4)POSIX

//POSIX(포직스)는 이식 가능 운영 체제 인터페이스(portable operating system interface)의 약자로
//서로 다른 UNIX OS의 공통 API를 정리하여 
//이식성이 높은 유닉스 응용 프로그램을 개발하기 위한 목적으로 IEEE가 책정한 어플리케이션 인터페이스 규격이다.

#include <stdio.h>
#include <io.h> //<fcntl.h> <sys/types.h> <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <wchar.h> // _wopen io.h or wchar.h

int main(int argc, char* argv[])
{
	int fd1, fd2;
	char buf[BUFSIZ];
	int n;

	if (argc != 3) {
		fprintf(stderr, "USAGE : %s SourceFile ObjectFile\n", argv[0]);
		return 1;
	}

	_sopen_s(&fd1, argv[1], O_RDONLY | O_BINARY, _SH_DENYNO, S_IREAD | S_IWRITE);

	if (fd1 < 0) {
		fprintf(stderr, "Error : cannot open %s\n", argv[1]);
		return 2;
	}

	_sopen_s(&fd2, argv[2], O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, _SH_DENYNO ,S_IREAD | S_IWRITE);

	if (fd2 < 0) {
		fprintf(stderr, "Error : cannot create %s\n", argv[2]);
		return 2;
	}

	printf("FileCopy %s to %s\n\n", argv[1], argv[2]);
	while ((n = _read(fd1, buf, BUFSIZ)) > 0) {
		if (_write(fd2, buf, n) != n) {
			//저수준 화일 입출력에는 read와 write 밖에 없다.
			//따라서 문자 데이터를 출력에는 괜찮지만, 정수나 실수값을 출력하고자 할 때에는 이를 ASCII 코드 형태로,
			//즉 문자 형태로 변환한 다음 출력해야 하기 때문에
			//그러한 경우에는 고수준의 입출력 함수를 사용하는 것이 더 편리하다.
			fprintf(stderr, "Error in writing %s \n", argv[2]);
			return 4;
		}
	}

	if (n < 0) {
		fprintf(stderr, "Error in reading %s\n", argv[1]);
	}

	_close(fd1);
	_close(fd2);
}


반응형