라이즈러리를 fcntl.h, unistd.h 두개 밖에 못쓰는 상황에서 Int형 변수를 write함수로 화면에 바로 출력하려면 어떻개 해야할까요? Char* a="1234" 이런건 write(1,a,4) 이런식으로 출력가능한데 정수를 담고있는 int형 변수를 출력해주는 방법은 모르겠네요 ㅠ
- stdio.h가 있는데서. 디버깅 하시면 편합니다. - 리눅스 명령어 cat 으로. 값을 확인하실 수 있습니다. - 1바이트씩 값을 출력해서. 확인하는 방법도 있습니다.https://ide-run.goorm.io
#include <fcntl.h> #include <unistd.h> //디버그 표시 1 //디버그 비표시 0 #define DF_DEBUG 1 #if DF_DEBUG #include <stdio.h> #endif int main() { int fd; char buf[5] = {"test"}; char tmp[5] = {0x00,}; //0x00 으로 초기화. 반드시 필요. (잘못된 값이 들어가지 않기 위해서.) //파일 생성하기 //http://forum.falinux.com/zbxe/index.php?document_srl=408448&mid=C_LIB fd =open("./byte.bin", O_RDWR | O_CREAT, 0644); if(fd == -1) { #if DF_DEBUG printf("open fail\n"); #endif return 0; } //--------------------------------------------------------------------- //4바이트 배열 쓰고 읽기 //--------------------------------------------------------------------- //http://forum.falinux.com/zbxe/index.php?document_srl=408456&mid=C_LIB //fd에 buf값을 4바이트 쓰기 //byte.bin test write(fd, buf, 4); //fd의 0번째 위치로 이동 lseek(fd, 0, SEEK_SET); //fd에서 4바이트 읽어서. char형 배열변수 tmp에 저장 read(fd, tmp, 4); #if DF_DEBUG printf("4바이트 배열 쓰고 읽기 : %s\n",tmp); #endif //--------------------------------------------------------------------- //4바이트 정수 숫자 쓰기 //--------------------------------------------------------------------- //char == 1바이트 == 8비트 //char* == 4바이트 == 32비트 //int == 4바이트 == 32비트 //int* == 4바이트 == 32비트 //정수형 숫자 int n = 123; //fd 의 4번째 위치에서 4바이트 쓰기 lseek(fd, 4, SEEK_SET); //fd 에 정수형변수 n을 4바이트 만큼 저장 //byte.bin test???? write(fd, &n, 4); //fd의 4번째 위치로 이동 lseek(fd, 4, SEEK_SET); //fd에서 4바이트 읽어서. 정수형 변수 n에 저장 n = 0; read(fd, &n, 4); #if DF_DEBUG printf("4바이트 정수 숫자 쓰기 : %d\n",n); #endif #if DF_DEBUG printf("%x %x %x %x\n",n, n<<8, n<<16, n<<24); #endif //--------------------------------------------------------------------- //1바이트씩 쓰고 읽기 //--------------------------------------------------------------------- lseek(fd, 8, SEEK_SET); char c; c = n; write(fd, &c, 1); c = n<<8; write(fd, &c, 1); c = n<<16; write(fd, &c, 1); c = n<<24; write(fd, &c, 1); #if DF_DEBUG printf("1바이트씩 쓰고 읽기\n"); c = n; printf("%x\n",c); c = n<<8; printf("%x\n",c); c = n<<16; printf("%x\n",c); c = n<<24; printf("%x\n",c); #endif //---------------------- //4바이트 정수로 읽기 //---------------------- n = 0; lseek(fd, 8, SEEK_SET); read(fd, &n, 4); #if DF_DEBUG printf("4바이트 정수로 읽기 : %d\n",n); printf("%x %x %x %x\n",n, n<<8, n<<16, n<<24); #endif //---------------------- //1바이트씩 읽기 //---------------------- lseek(fd, 8, SEEK_SET); // #if DF_DEBUG printf("1바이트씩 읽기 시작\n"); #endif // char c1, c2, c3, c4; read(fd, &c1, 1); #if DF_DEBUG printf("%x\n",c1); #endif read(fd, &c2, 1); #if DF_DEBUG printf("%x\n",c2); #endif read(fd, &c3, 1); #if DF_DEBUG printf("%x\n",c3); #endif read(fd, &c4, 1); #if DF_DEBUG printf("%x\n",c4); #endif #if DF_DEBUG printf("1바이트씩 읽기 : %x %x %x %x\n",c1, c2, c3, c4); printf("c1 | c2<<8 | c3<<16 | c4<<24 : %d\n", c1 | c2<<8 | c3<<16 | c4<<24); n = c1 | c2<<8 | c3<<16 | c4<<24; printf("n = c1 | c2<<8 | c3<<16 | c4<<24 : %d\n", n); #endif //외부에서 데이터값을 확인하는 방법 // system("cat ./byte.bin"); close(fd); return 0; } // 4바이트 배열 쓰고 읽기 : test 4바이트 정수 숫자 쓰기 : 123 7b 7b00 7b0000 7b000000 1바이트씩 쓰고 읽기 7b 0 0 0 4바이트 정수로 읽기 : 123 7b 7b00 7b0000 7b000000 1바이트씩 읽기 시작 7b 0 0 0 1바이트씩 읽기 : 7b 0 0 0 c1 | c2<<8 | c3<<16 | c4<<24 : 123 n = c1 | c2<<8 | c3<<16 | c4<<24 : 123
---------------------------------------------------------------------------- 젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다. 정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
결국 printf("%d", a)의 기능을 구현해야 하는 건데,https://code.woboq.org/userspace/glibc/stdio-common/vfprintf.c.html#1237 여기에 printf의 구현 소스가 있으니 이걸 보시고 짠~...은 농담이고요.
문자열은 출력할 수 있으니까, 숫자 1234를 출력한다면 문자열 버퍼에 "1234"를 저장할 수 있으면 되는 거죠.
일단 1234를 계속 10으로 나누면서 나머지를 문자로 변환하여 저장하면 "4321"이 되고, 이걸 다시 역순으로 바꿔 저장한 다음 write로 한번에 출력하거나, 아니면 그냥 끝에서부터 역순으로 한글자씩 출력하거나 하시면 될 것 같습니다.
좋은 하루 되세요!
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
참고해보세요.
- stdio.h가 있는데서. 디버깅 하시면 편합니다.
- 리눅스 명령어 cat 으로. 값을 확인하실 수 있습니다.
- 1바이트씩 값을 출력해서. 확인하는 방법도 있습니다.
https://ide-run.goorm.io
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
결국 printf("%d", a)의 기능을 구현해야
결국 printf("%d", a)의 기능을 구현해야 하는 건데,
https://code.woboq.org/userspace/glibc/stdio-common/vfprintf.c.html#1237
여기에 printf의 구현 소스가 있으니 이걸 보시고 짠~...은 농담이고요.
문자열은 출력할 수 있으니까,
숫자 1234를 출력한다면 문자열 버퍼에 "1234"를 저장할 수 있으면 되는 거죠.
일단 1234를 계속 10으로 나누면서 나머지를 문자로 변환하여 저장하면 "4321"이 되고,
이걸 다시 역순으로 바꿔 저장한 다음 write로 한번에 출력하거나,
아니면 그냥 끝에서부터 역순으로 한글자씩 출력하거나 하시면 될 것 같습니다.
좋은 하루 되세요!
댓글 달기