[질문] 파일 다루기...

hurryon의 이미지

으흠...혹시나 하고 했다가...이거 황당한 경우을 발견했습니다. 아니 발견이라
기 보다는...제 자신의 무지함을 발견했다고 해야 겠죠.

소스는 다음과 같습니다.

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *fp;
    int i;
    char buf[10];

    fp = fopen(argv[1], "r");

    memset(buf, 0x00, 10);

    fgets(buf, 10, fp);
    printf("%s", buf);

    memset(buf, 0x00, 10);

    fgets(buf, 10, fp);
    printf("%s", buf);

    return(0);
}

결과는...

[hurryon@ns2 tmp]$ cat hurryon.dat
hurryonlove0052chongnux
[hurryon@ns2 tmp]$ gcc -o test test.c
[hurryon@ns2 tmp]$ ./test hurryon.dat
[hurryon@ns2 tmp]$

하지만 소스을 다음과 같이 하면...

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *fp;
    int i;
    char buf[10];

    fp = fopen(argv[1], "r");

    memset(buf, 0x00, 10);

    fgets(buf, 10, fp);
    printf("%s\n", buf);

    memset(buf, 0x00, 10);

    fgets(buf, 10, fp);
    printf("%s\n", buf);

    return(0);
}

결과는 다음과 같습니다.

[hurryon@ns2 tmp]$ cat hurryon.dat
hurryonlove0052chongnux
[hurryon@ns2 tmp]$ gcc -o test test.c
[hurryon@ns2 tmp]$ ./test hurryon.dat
hurryonlo
ve0052cho
[hurryon@ns2 tmp]$

으흠...왜 이런지요? 에휴...무지함에 눈물이...흐흑...

부활의 이미지

fclose 로 닫아야 flush되서 출력되지 않나요?
\n이 붙으면 다음 라인으로 넘어가니 저절로 flush되나...

hurryon의 이미지

으흠...깜빡했네요...하지만 fclose 을 해도 마찬가지네요.

왜 이러지?

wind772의 이미지

방금 위에 소스 갖다가 컴파일 해보니 저는 잘 되는데요..^^;;


[wind772@TEST tmp]$ cat a
hurryonlove0052chongnux
[wind772@TEST tmp]$ 
[wind772@TEST tmp]$ cat test1.c

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *fp;
    int i;
    char buf[10];

    fp = fopen(argv[1], "r");

    memset(buf, 0x00, 10);

    fgets(buf, 10, fp);
    printf("%s", buf);

    memset(buf, 0x00, 10);

    fgets(buf, 10, fp);
    printf("%s", buf);

    return(0);
}

[wind772@TEST tmp]$ ./test1 a
hurryonlove0052cho[wind772@TEST tmp]$ 

[wind772@test tmp]$ cat test2.c

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *fp;
    int i;
    char buf[10];

    fp = fopen(argv[1], "r");

    memset(buf, 0x00, 10);

    fgets(buf, 10, fp);
    printf("%s\n", buf);

    memset(buf, 0x00, 10);

    fgets(buf, 10, fp);
    printf("%s\n", buf);

    return(0);
}

[wind772@TEST tmp]$ ./test2 a
hurryonlo
ve0052cho
[wind772@TEST tmp]$ 

내 컴터가 이상한건가..-_-a

===================================================
중요한건 얼마나 아느냐가 아니라 그것에 대한 열정이다.

kis2u의 이미지

터미널 문제가 아닌가 싶네요...

"hurryonlo"와"ve0052cho" 단어가

붙어서.. 한줄에 출력된 후에..

쉘 프롬프트 "[hurryon@ns2 tmp]$"가 그 화면을 덮어버리는거죠.. -0-;

printf 문에서.. "\n"를 넣어 줬을때는 한줄을 아래로 내려서 출력하기 때문에

결과가 제대로 출력되는거구요..

두번째 printf 문에서 "\n"을 제거하면 "hurryonlo" 만 출력되지 않을까 싶습니다..

hurryon의 이미지

으흠...이런 경우는 정말 처음입니다...왜 내게 이런 시험에 들게 하시는지?
으흠...사용하고 있는 클라이언트는 SSH Secure Shell 입니다. 그리고
터미날은 xterm 으로 맞추어 놓았는데...으흠...

그리고 한가지 더 궁금한것이 있습니다. 제가 버퍼을 10개로 잡아 놓았고
fgets() 에서도 10개을 읽어 들였는데...9개의 문자밖에 읽혀지지
않는군요.

그렇다면 나머지 하나에는 '\0'이 자동으로 들어가 있는것 인지요?

kis2u의 이미지

char *fgets(char *s, int size, FILE *stream);

fgets()는 size개 이하의 문자를 stream으로 부터 읽어서, s가 가리키는 버퍼에 저장하고, 버퍼의 마지막에 "\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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.