2012-12-12 2 views
1

텍스트 파일에서 80자를 읽고 문자열에 저장 한 다음 확인을 위해 해당 문자열을 인쇄하고 싶습니다. 내가 FREAD를 사용하여이 코드가 있어요 :fread를 사용하여 텍스트 파일을 읽을 때 ' '또는 '@'기호 가져 오기

char message[80]; 
size_t nread = fread(message, 1, sizeof(message), fp); 
printf("Message received: \"__%s__\"\n", message); 

을 그리고 출력은 다음과 같습니다

메시지 수신 : "__I 세상을 바꿀 사랑하지만하지 않습니다
__ 것"

전체 구절은 파일에없는 경우

과 :

__I는 세상을 바꾸고 싶지만 전체 문구가 파일에있을 때 그들은 나에게 소스 코드를
@__

를 제공하지 않습니다.

나는 그것을 삭제하고 텍스트를 다시 쓰려고했지만 동일한 출력을 다시 얻습니다.

무엇이 잘못 되었나요? 문자셋으로 뭔가?

+1

시도를' 메시지 [nread] = 0'. – cnicutar

+1

@cnicutar,'80'을 읽으면'message'의 끝을 지나게됩니다. – hmjd

+0

@hmjd 그래,'nread'는 이것보다 먼저 검사해야합니다. 또는 sizeof - 1을'fread'에 전달합니다. – cnicutar

답변

6

fread() null을 지정하지 않으면 버퍼가 종료되고 prinf("%s")은 버퍼가 null로 종료 될 것으로 예상합니다. 버퍼가 null로 끝나지 않으므로 printf()은 null 종결자를 찾을 때까지 계속 읽기 때문에 길을 따라 정크가 출력됩니다.

하나는 null null 종결을위한 공간을 떠나 기억 버퍼를 종료 : "%.*s" 형식 지정자 사용하여 읽기 인쇄 문자의 수를

char message[81]; /* Increased by 1 for null terminator. */ 
size_t nread = fread(message, 1, sizeof(message) - 1, fp); 
message[nread] = 0; 
printf("Message received: \"__%s__\"\n", message); 

또는에만 printf() 지시 :

printf("Message received: \"__%.*s__\"\n", nread, message); 
+0

좋아요! 나는 그것이 _message [nread] = '\ 0';와 함께 버퍼를 null로 끝냈다 고 생각했다; _. 그래서 나는 그것을 null로 끝낼 것이라고 생각합니다. 하지만 printf로 무엇을하고 있는지 나에게 설명해 주시겠습니까? '*'는 nread 변수를 의미합니까? – Chris

+1

@Chris,' "%. * s"'는 길이와 버퍼의 두 인수가 필요한 형식 지정자입니다. 'printf()'가'message'에서 첫 번째'nread' 문자를 출력하도록 명령합니다.'message'에 널 종결자가 필요하지 않습니다. – hmjd

+0

감사합니다. 실제로 printf에 대해 몰랐습니다. – Chris

관련 문제