[질문] 파일 다루기...
      글쓴이: hurryon / 작성시간: 월, 2003/03/24 - 8:52오후    
  
  으흠...혹시나 하고 했다가...이거 황당한 경우을 발견했습니다. 아니 발견이라
기 보다는...제 자신의 무지함을 발견했다고 해야 겠죠.
소스는 다음과 같습니다.
#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]$ 
으흠...왜 이런지요? 에휴...무지함에 눈물이...흐흑...
Forums: 


닫으셔야져
fclose 로 닫아야 flush되서 출력되지 않나요?
\n이 붙으면 다음 라인으로 넘어가니 저절로 flush되나...
음냐...마찬가지 네요.
으흠...깜빡했네요...하지만 fclose 을 해도 마찬가지네요.
왜 이러지?
방금 위에 소스 갖다가 컴파일 해보니 저는 잘 되는데요..^^;;
방금 위에 소스 갖다가 컴파일 해보니 저는 잘 되는데요..^^;;
[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
===================================================
중요한건 얼마나 아느냐가 아니라 그것에 대한 열정이다.
제가 생각하기엔..
터미널 문제가 아닌가 싶네요...
"hurryonlo"와"ve0052cho" 단어가
붙어서.. 한줄에 출력된 후에..
쉘 프롬프트 "[hurryon@ns2 tmp]$"가 그 화면을 덮어버리는거죠.. -0-;
printf 문에서.. "\n"를 넣어 줬을때는 한줄을 아래로 내려서 출력하기 때문에
결과가 제대로 출력되는거구요..
두번째 printf 문에서 "\n"을 제거하면 "hurryonlo" 만 출력되지 않을까 싶습니다..
앗...정답이십니다...
으흠...이런 경우는 정말 처음입니다...왜 내게 이런 시험에 들게 하시는지?
으흠...사용하고 있는 클라이언트는 SSH Secure Shell 입니다. 그리고
터미날은 xterm 으로 맞추어 놓았는데...으흠...
그리고 한가지 더 궁금한것이 있습니다. 제가 버퍼을 10개로 잡아 놓았고
fgets() 에서도 10개을 읽어 들였는데...9개의 문자밖에 읽혀지지
않는군요.
그렇다면 나머지 하나에는 '\0'이 자동으로 들어가 있는것 인지요?
man 페이지에 의하면..
char *fgets(char *s, int size, FILE *stream);
fgets()는 size개 이하의 문자를 stream으로 부터 읽어서, s가 가리키는 버퍼에 저장하고, 버퍼의 마지막에 "\0"를 추가한다고 합니다.
댓글 달기