본문 바로가기

알고리즘-연습문제

파일의 입력과 출력 4

문제> 사용자로부터 총 다섯 개의 숫자(정수)를 입력 받아서 순서대로 파일에 저장하는
         프로그램을 작성하자

이 문제 풀면서 잼있는걸 발견했다. ㅋㅋ
자 조금 어려울수 있다.

보통 우리가 파일에 저장할때 (저 같은 경우는 대부분 fprintf , fscanf를 이용햇음)
여러 입출력 함수가 있는데 과연 무슨 차이가 있을까?



사용자 삽입 이미지


fwrite를 사용하였다.

흠 과연 fwrite와 fputc에 차이점이 있을까?
여기서 말한 차이점은 기능을 말한게 아니다.

과연 파일안에 들어간 숫자가 차이가 있냐는 말이다.
바이너리 파일이므로 처음에 이걸 vim으로 읽으면 깨진다.

그래서 네이뇬검색으로 리눅스 binary코드 읽는 명령어를 찾았다.
필자는 리눅스 볼때마다 명령어를 까먹는다.  ㅋㅋ

!!!! 참고로 필자는 프로그램에서 값을 1, 2, 3, 4, 5로 주고 실행했다.

xxd <--- 뭔가 있어보이는 명령어다.

xxd numeric.dat 를 읽는다.
사용자 삽입 이미지

처음 이걸보고 이해를 못했다.

자 그럼 fputc를 이용해서 보았다.

사용자 삽입 이미지


뭔가 감이 올거다.. (아닌가? ㅋㅋ)

처음 numeric.dat를 보자

0100 -->  숫자 100이다. ㅡㅡ
2진수이다.  근데 처음에 분명 1을 주었는데
리눅스가 맛이 간걸까?
더 우낀건 그 다음이 0000이다.

왜 그런걸까?
이걸 알려면 일단 endian에 대한 개념이 있어야한다.
크게 어려운게 아니다.

쉽게 말해 우리가 생각하는 비트에 위치가 바꿔진거다.
흠... 이건 네이뇬에 검색해보면 바로 나온다. ㅋㅋ

다시 코드를 보면 난 분명 int 변수를 만들어 사용하였다.
int는 4바이트이다. (설마 좀 아시는 분들 이것 가지고 뭐라말자..ㅡㅡ)

xxd 는 16진수 코드로 표현한다.
그럼 답이 보인다.
바로 4바이트이니 0100 0000     <--- 요게 내가 저장한 1이다.
1이 앞에 있는 이유는 little endian 때문이다.
다시 한번 네이뇬 검색하시길...

그럼
xxd numeric2.dat   이건 fputc로 한것이다.
이건 그냥 그대로 읽으면 ...
0102 0304 05  ㅋㅋ
1바이트로 저장하였다.

사실 이게 이해가 잘 안되는게 왜 한바이트로 저장된거지..?
왜일까? ㅋㅋ
fputc에 마지막의 c는 character이다.

무슨말인지 아실듯.....