c언어 기본적인 질문입니다.(배열(혹은 버퍼) 값과 아스키코드)
글쓴이: bshi02 / 작성시간: 금, 2015/03/20 - 3:21오전
제가 c언어를 배우는데 잘 이해가 않가는 부분이 있어서 질문 합니다만.
#include <stdio.h> int main() { char word[30]={"long sentence"}; printf("%d ",word[0]); printf("%d ",word[1]); printf("%d ",word[2]); printf("%d ",word[3]); printf("%d ",word[4]); printf("%d ",word[5]); printf("%d ",word[6]); printf("%d ",word[7]); printf("%d ",word[8]); printf("%d ",word[9]); printf("%d ",word[10]); printf("%d ",word[11]); printf("%d ",word[12]); printf("%d ",word[13]); printf("%d ",word[14]); printf("%d ",word[15]); printf("%d ",word[16]); printf("%d ",word[17]); printf("%d ",word[18]); return 0; }
제가 위의 소스를 code block에 입력해서 실행하면 word[30]의 배열에 대한 아스키 코드값이 제대로 출력되는 데요,
그런데 아래의 소스를 code block에 입력해서 실행하면 buff[50]배열에 대한 아스키 코드값이 50개 이상으로 나오더군요.제가 알기로는 배열의 크기를 50으로 정했고
1바이트의 char형이기 때문에 89바이트의 s.txt파일의 내용이 전부 buff[50]배열로 저장될 수 없다고 생각하는데요..
#include <stdio.h> int main() { int len; char buff[50]={0}; FILE *fp=fopen("s.txt","rb"); if(fp!=NULL){ while(!feof(fp)){ len=fread(buff,sizeof(char),10,fp); if(ferror(fp)) break; /*buff[len]=0;*/ printf("%d ",buff[0]); printf("%d ",buff[1]); printf("%d ",buff[2]); printf("%d ",buff[3]); printf("%d ",buff[4]); printf("%d ",buff[5]); printf("%d ",buff[6]); printf("%d ",buff[7]); printf("%d ",buff[8]); printf("%d ",buff[9]); printf("%d ",buff[10]); printf("%d ",buff[11]); printf("%d ",buff[12]); printf("%d ",buff[13]); printf("%d ",buff[14]); printf("%d ",buff[15]); printf("%d ",buff[16]); printf("%d ",buff[17]); printf("%d ",buff[18]); printf("%d ",buff[19]); printf("%d ",buff[20]); printf("%d ",buff[21]); printf("%d ",buff[22]); printf("%d ",buff[23]); printf("%d ",buff[24]); //printf("%s ",buff); } fclose(fp); } return 0; }
그리고 fread에서 지정된 10개의 char형의 문자를 읽어 들이면 문장의 끝을 나타내기 위해서 자동으로 NULL을 붙이는 건 맞는거 같은데 printf("%d "가 실행되면서 보이는 아스키 코드값이 0인 NULL값이 너무 많더군요.문장 사이마다 무조건 NULL값이 15개 이상은 너무 심한 것 같습니다.)
참고로 s.txt의 내용은
I'm a boy and You are a girl and She is a woman and He is a man and They are all human!!
입니다.(89바이트)
왜 파일 스트림을 이용한 배열은 printf("%d"를 사용하면 아스키값이 지정한 수 이상 나오는지
그리고 fread로 파일스트림(*fp)에서 읽을 데이터의 크기(형의 사이즈*횟수)를 지정하면 그 이후에 NULL문자가 왜 무조건 10개 이상이 붙는지 그이유를 꼭 알고 싶은데 혹시 답변 해주실 분이 없을까요?
제 애매모호한 질문에 대해서 정확한 답변이 가능하신 분이 있으시다면 정말 좋겠습니다.
Forums:
우선 fread는 끝에 null문자를 추가하지
우선 fread는 끝에 null문자를 추가하지 않습니다.
문자열 형태로 읽는 함수가 아니기때문입니다.
buff 배열은 크기가 50이고 전부 null로 초기화 되어있습니다.
위 소스에 의하면 fread로 10바이트씩 읽고 0~24 번을 출력하네요.
0~9는 파일에서 읽어온 10바이트로 채워질것이고 10~24는 이전값과 마찬가지로 null이겠군요.
15개의 null이 생기는것은 당연합니다.
89바이트가 50바이트안에 들어가는것은 아닙니다.
위 소스에선 0~9번지에 10바이트씩을 계속 갱신하고 있기때문에 이전 데이터는 사라지고 다음 10바이트를 가져오겠지요.
89바이트가 50바이트안에 들어가는것은 아닙니다. 위
89바이트가 50바이트안에 들어가는것은 아닙니다.
위 소스에선 0~9번지에 10바이트씩을 계속 갱신하고 있기때문에 이전 데이터는 사라지고 다음 10바이트를 가져오겠지요.
fread가 실행될때마다 buff배열을 계속 갱신하는군요!
저는 fread가 이전실행의 파일 스트림의 포인터(fp)를 기억하는 것처럼 저장되는 버퍼주소인 buff포인터도 “당연히” 기억한다고 생각했는데 포인터 fp와 달리 buff는 fread가 실행될때마다 주소값이 전부 초기화되는 군요.
그러면 당연히 buff배열의 크기가 fread에 지정된 크기보다 작지만 않으면 계속 while문 안에서 printf가 buff에 저장된 문자를 표시하면서 이후 fread에 의해 buff가 초기화 되고 저장된 fp포인터에서 값을 읽어서 buff배열에 저장하고 printf가 문자를 표시하고… 계속 이 과정이 반복되는 군요.
답변 감사합니다. 덕분에 fread에 대해서 더 자세히 알게 되었네요.
NULL을 @ 로 표시한다면
NULL을 @ 로 표시한다면
123456789012345678901234567890
1. buff = "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
2. buff = "I'm a boy @@@@@@@@@@@@@@@@@@@@"
3. buff = "You are a @@@@@@@@@@@@@@@@@@@@"
...
위와 같이 앞에 10바이트만 복사 하게 됩니다.
NULL값은 10개 이상 붙은게 아니고,
처음(char buff[50]={0};)에 초기화 한 이후에는
데이터의 크기(형의 사이즈*횟수)를 제외한
뒤에 20바이트에 대하여 변경하지 않아서 입니다.
수고하세요.
앞에 띄어쓰기가 다 앞으로 밀리는군요. 처음 글을 써
앞에 띄어쓰기가 다 앞으로 밀리는군요.
처음 글을 써 보아서 몰랐습니다.
1234.... 이것은 스트링의 길이를 보기 좋기 하기위한 숫자였으며
notepad같은 monospace 에디터에서 보면 줄이 맞춰져 보입니다.
댓글 달기