반응형
출처 : 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); }
반응형