[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 |