[공부]write 의 stdout 출력 에 대한 궁금증

BarracuTa의 이미지

안녕하세요 이제 막 입문 과정을 밟고 있는 새내기 입니다..
write 의 stdout 출력에 관한 내용을 해보던 중 의문점이 생겨 이렇게 글 올립니다.
너무 초보적 원초적 (?) 질문 인것 같아 잠시 망설이고 여러 방면 검색을 해보았습니다.(이곳에서 wirte and stdout 등 으로 검색해도 안나오던군요 ㅜㅜ)
결국 이곳에 올리게 되었습니다.
좋은 가르침 부탁드립니다. 감사합니다.
그럼 ..
아래 코드에서 char 는 제대로 출력되지만 int 형은 출력 되지 않는 이유를 모르겠습니다. 왜그런건가요???

오늘 비가 많이 왔는데 여름철 건강 주의하세요 ..
그럼 전 답변을 기다리며 .... ^^;

  
      1 #include <unistd.h>
      2 int main()
      3 {
      4     int n;
      5     char c='a';
      6     for(n=0;n<3;n++)
      7     {
      8         write(1,&n,sizeof(int));
      9         write(1,&c,sizeof(char));
     10     }
     11 }
서지훈의 이미지

분명히 출력은 되었으나 사람눈으로 확인이 불가능 한것입니다.
아래 코드를 테스트 삼아서 실행해 보심이...

#include <unistd.h>
int main()
{
    int n;
    char c='A';



    for(n=0;n<4;n++) {
        memset(&n, 'a', 4);

        write(1,&n,sizeof(int));
        write(1,&c,sizeof(char));
    }


    return 0;
}

그리고, ASCII code표를 참고 하셔야 할듯 하군요.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

추신_솔직히 이 code 만으로 이해를 하기엔 좀 어려 울수도 있으나 생각을 해보시길...
그리고 다시 질문을 하시길 바랍니다.

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

BarracuTa의 이미지

아 드디어 들어 왔습니다.
많은 힌트 감사 합니다.
int 형은 4바이트인데 거기에 들어간 각바이트단위 출력시 당연 사용자눈에 안보인다는 그말씀이시죠..

답변달라고 kldp 들어오는데 계속 안들어와지더군요 이제야 되니 다행입니다..

다시한번 감사드립니다.

저희 업소를 방문해 주셔서 감사합니다.

서지훈의 이미지

제가 말씀을 드리고 싶은 부분이랑은 좀 다르게 이해를 하신듯 하네요.
int 형의 값이 4 bytes라서 출력이 안된게 아니라...
출력한값(0x00 0x01 0x02 0x03)값들이 화면에 표현 할 수 없는 값들이기 때문입니다.
n 값을 for()문에서 초기화 할 때 0x30 0x41 0x61 중에 선택 하시면은 숫자나 영문 대소문자가 찍히는 것을 볼 수가 있습니다.
그러나 앞의 세 바이트는 여전히 0x00이기 때문에 마지막 바이트만 출력이 됩니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

cinsk의 이미지

출력을 od와 같은 dump filter에 넣으면 좀 더 확실히 알 수 있을 것 같습니다:

$ ./a.out | od -t xC
0000000 ?? ?? ?? ?? 41
0000005
$ _
익명 사용자의 이미지

#include <unistd.h>
#define MAXSIZE 1024
int main()
{
   int n;
   char c='a';
   char buf[MAXSIZE];
   int  ret;

   for(n=0;n<3;n++)
   {
      write(1,&n,sizeof(int));
      write(1,&c,sizeof(char));
   }
   printf("***\n");
   for(n=0;n<3;n++)
   {
      ret = snprintf( buf, MAXSIZE, "[%010d] [%c]\n", n, c);
      write( 1, buf, ret);
   }
   return 0;
}

그래서 write를 쓰고자 할때, 버퍼에 포맷팅해주는 snprintf()시리즈를 사용하게 되지요.
kenos의 이미지

그저 심심해서 생각나는 김에 해봤습니다.
숫자의 경우만 그것도 한자리 숫자의 경우 ;;

#include <stdio.h>
#define MAXSIZE 1024
int main()
{
   int n,m;
   char c='a';
   char buf[MAXSIZE];
   int  ret;
 
   for(n=0;n<3;n++)
   {
      m = n + '0';
      write(1,&m,sizeof(int));
      write(1,&c,sizeof(char));
   }
   printf("***\n");
   for(n=0;n<3;n++)
   {
      ret = snprintf( buf, MAXSIZE, "[%010d] [%c]\n", n, c);
      write( 1, buf, ret);
   }
   return 0;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.