본문 바로가기

c언어

18. 파일 입출력

[18장 연습문제]

 

1. 표준 입력 장치에서 문자열을 입력받은 후, 표준 출력 장치로 출력하는 프로그램을 작성하세요. 단, 반드시fgets()와 fputs() 함수를 사용하세요.

[소스코드]

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
	char buffer[255] = { 0 };
	fputs("Input your string : ", stdout);
	fgets(&buffer, _countof(buffer), stdin);
	fputs(buffer, stdout);

	return 0;
}

[실행화면]

 

 

2. 현재 경로에서 TestFile.txt 파일을 열어서, 사용자가 입력한 문자열을 뒤에 이어서 추가한 후 다시 저장하는 프로그램을 작성하세요.

[소스코드]

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
	FILE* fp = NULL;
	char* buffer[255] = { 0 };

	fp = fopen("TestFile.txt", "a");
	if (fp != NULL)
	{
		fputs("Input your string: ", stdout);
		gets_s(buffer, sizeof(buffer));
		int res = fwrite(buffer, strlen(buffer), 1, fp);
		if (res > 0)
		{
			puts("Success!");
		}
		else
		{
			puts("Fail");
		}
		fclose(fp);
	}
	return 0;
}

[실행화면]

Before)

After)

 

 

3. 현재 경로에서 TestFile.txt 파일을 열어서, 원본 파일에서 행 단위로 문자열을 읽어 들여 대상 파일에 복사하는 프로그램을 작성하세요. 단, 대상 파일도 현재 경로에 만들며 파일 이름은 DstFile.txt로 합니다.

[소스코드]

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
	FILE* fp = NULL;
	char* szBuffer[255] = { 0 };

	fp = fopen("TestFile.txt", "r");
	if (fp != NULL)
	{
		FILE* dst = NULL;
		dst = fopen("DstFile.txt", "w");
		if (dst != NULL)
		{
			while (!feof(fp)) 
			{
				fgets(szBuffer, sizeof(szBuffer) - 1, fp);
				fwrite(szBuffer, strlen(szBuffer), 1, dst);
			}
			puts("Success!");
			fclose(dst);
		}
	}
	return 0;
}

[TestFile.txt]

[DstFile.txt]

[실행화면]

 

 

4. main() 함수의 인자로 두 바이너리 파일의 경로를 입력받아 바이너리 모드로 열고, 원본 파일의 내용을 읽어 들여 대상 파일로 복사하는 프로그램을 작성하세요. 단, 복사 진행 과정을 백분율로 화면에 출력하고, 한 번에 4KB 단위로 복사합니다. 그리고 대상 파일의 존재 유무에 상관없이 무조건 만들며, 파일의 크기가 최대 100MB 이상인 경우는 고려하지 않습니다.

샘플 파일 다운로드 URL

https://docbox.etsi.org/stq/Open/Binary%20files

 

Directory Listing /stq/Open/Binary files

1MB.bin 2013-09-20 9:17 1024 KB

docbox.etsi.org

[소스코드]

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

#define BUFFER_SIZE				4096+1
#define READ_SIZE				4096
#define FILE_NAME				"10MB.bin"

// 커서 위치 이동
void gotoxy(int x, int y) 
{
	COORD pos = { x, y };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
	return;
}

// 커서 감추기
void hideCursorView()
{
	CONSOLE_CURSOR_INFO cursorInfo = { 0, };
	cursorInfo.dwSize = 1; // 커서 굵기
	cursorInfo.bVisible = FALSE;
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo);
	return;
}

// 파일 크기 구하기
long getFileSize(const char* pszFileName) 
{
	FILE* fp = NULL;
	fp = fopen(pszFileName, "rb");
	long lFileSize = 0;
	if (fp != NULL)
	{
		fseek(fp, 0, SEEK_END);
		lFileSize = ftell(fp);
		fclose(fp);
	}

	return lFileSize;
}

int main(int argc, char* argv[])
{
	FILE* fp = NULL, *dst = NULL;
	char szBuffer[BUFFER_SIZE] = { 0 };
	COORD pos = { 0, 0 };
	int lAcc = 0L, lPercent = 0L;
	long lFileSize = getFileSize(FILE_NAME);

	hideCursorView();

	fp = fopen(FILE_NAME, "rb");
	if (fp != NULL)
	{
		dst = fopen("copy.bin", "wb");
		if (dst != NULL)
		{
			gotoxy(0, 0);
			putc('[', stdout);
			while (!feof(fp))
			{
				// read/write file
				memset(szBuffer, 0, READ_SIZE);
				int nCount = fread(szBuffer, sizeof(BYTE), READ_SIZE, fp);
				fwrite(szBuffer, nCount, 1, dst);

				// calculate loading size
				lAcc += nCount;
				lPercent = (long)((float)lAcc / (float)lFileSize * 100.f);

				// print progress
				gotoxy((int)(lPercent / 5L) + 1, 0);
				putc('=', stdout);

				gotoxy(0, 2);
				printf("다운로드 진행률 : %d%%", (int)lPercent);

				gotoxy(22, 0);
				putc(']', stdout);
			}
			
			gotoxy(0, 4);
			putc('\n', stdout);

			fclose(dst);
		}
		fclose(fp);
	}
	return 0;
}

 

[10MB.bin]

 

[copy.bin]

[실행화면]

 

'c언어' 카테고리의 다른 글

20. 완료 프로젝트  (0) 2023.08.06
19. 전처리기  (0) 2023.08.01
17. 기본 자료구조  (0) 2023.06.28
16. 구조체와 공용체  (0) 2023.06.28
15. 함수에 대한 고급 이론  (0) 2023.06.27