티스토리 뷰
파일 변환 프로그램을 만듭니다.
텍스트 파일에 저장된 8자리 정수 10개를 입력하여 바이너리 파일로 출력합니다.
그리고 입력한 파일과 출력한 파일의 바이트 수를 화면에 표시합니다.
입력 파일은 메모장 프로그램으로 숫자를 한 줄에 하나씩 작성하며,
마지막 숫자를 입력한 후에도 엔터를 쳐서 줄이 바뀌도록 작성합니다.
실행결과는 다음과 같습니다.
/*
실행결과
입력 파일의 크기 : 100바이트
출력 파일의 크기 : 40바이트
*/
a.txt 입력 파일 | b.txt 바이너리 파일 |
10000000 20000000 30000000 40000000 50000000 60000000 70000000 80000000 90000000 12345678 |
00000000100110001001011010000000... |
다음은 제가 작성한 코드입니다.
지금까지 실전문제를 접하면서 처음 완벽하게 풀지 못한 것 같습니다.
#include <stdio.h>
int main(void)
{
FILE* fpA, * fpB;
fpA = fopen("a.txt", "r");
if (fpA == NULL)
{
printf("파일을 열지 못했습니다.\n");
return 1;
}
fpB = fopen("b.txt", "wb");
if (fpB == NULL)
{
printf("파일을 생성하지 못했습니다.\n");
return 1;
}
int sizeA = 0, sizeB = 0;
while (1)
{
int num, res;
res = fscanf(fpA, "%d", &num);
if (res == EOF) break;
fgetc(fpA);
printf("%d\n", num);
sizeB += fwrite(&num, 1, sizeof(num) * 1, fpB);
}
fclose(fpA);
fclose(fpB);
fpA = fopen("a.txt", "r");
while (1)
{
int res;
res = fgetc(fpA);
if (res == EOF) break;
sizeA += 1;
}
fclose(fpA);
printf("입력 파일의 크기 : %d바이트\n", sizeA);
printf("출력 파일의 크기 : %d바이트\n", sizeB);
return 0;
}
/*
실행결과
10000000
20000000
30000000
40000000
50000000
60000000
70000000
80000000
90000000
12345678
입력 파일의 크기 : 90바이트
출력 파일의 크기 : 40바이트
*/
a.txt 입력 파일의 크기를 어떻게 구하면 좋을지 좋은 생각이 떠오르지 않았습니다.
fwrite 함수가 읽어들인 데이터의 개수를 반환한다는 것을 이용하고도 싶었습니다.
하지만 fwrite 함수는 텍스트 파일에는 쓸 수가 없기 때문이 다른 방법을 생각해야 했습니다.
결국 a.txt 파일을 다시 개방하여 문자 하나씩을 다 읽어가면서 크기를 계산했습니다.
문제에는 a.txt파일의 크기가 100바이트라고 나와있고, 실제 a.txt 파일의 속성을 확인해 봐도 100바이트가 맞습니다.
그런데 안에 내용을 보면 분명 한 줄에 숫자 8개와 개행문자가 있고,
그게 총 10줄이 있으니 90바이트가 돼야 맞지 않나하는 생각이 들었습니다.
이 부분은 왜 100바이트로 계산이 되는지 전혀 알지 못하겠습니다.
이번 문제는 이렇게 풀고 마무리해야 할 것 같습니다.
'공부 일지 > C언어 공부 일지' 카테고리의 다른 글
파일 입출력 실전문제3 (0) | 2021.02.04 |
---|---|
파일 입출력 실전문제2 (2) | 2021.02.01 |
다양한 파일 입출력 함수 (0) | 2021.02.01 |
파일 입출력 (0) | 2021.02.01 |
사용자 정의 자료형 실전문제2 (0) | 2021.01.31 |