2014-04-01 3 views
0

간단한 열기 및 쓰기를 수행하는 이상한 결과가 있습니다. 내가 프로그램을 인용거야 다음 난 내 결과를 설명 할 것이다 :이 코드를 사용하여쓰기가 파일에 이상한 resuts를 생성합니다.

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main(){ 
    int fd = open("hello.txt", O_WRONLY|O_CREAT, 0700); 
char buf[] = "Hello world\n"; 
int i=0; 
for(i = 0; i < 10;i++){ 
    write(1,buf,sizeof(buf)); 
    write(fd, buf, sizeof(buf)); 
} 
close(fd); 
return 0; 
} 

을, 터미널의 출력은 예상대로 세계 안녕하세요 십 배 ...하지만 것 파일 hello.txt의 I에 얻으십시오 :

效汬潷汲੤䠀汥潬眠牯摬 
效汬潷汲੤䠀汥潬眠牯摬 
效汬潷汲੤䠀汥潬眠牯摬 
效汬潷汲੤䠀汥潬眠牯摬 
效汬潷汲੤䠀汥潬眠牯摬 

1) 왜 이런 일이 발생합니까? 나는 무엇을 잘못 했는가? 그리고 왜 중국인입니까? 사전에 감사

편집 : -Wall 플래그와 함께 GCC 4.8.1를 사용하여 컴파일 : 더 경고하지

+0

컴파일하고 실행할 때이 오류가 발생하지 않습니다. – squiguy

+0

나를 위해 잘 작동합니다. 터미널 설정을 확인하고 싶을 수 있습니다. – Asblarf

+0

'open '을 호출 한 후 fd! = -1을 확인 했습니까? –

답변

2

당신은 13 자합니다 (종료 0 포함 sizeof(buf)를 작성하는

당신이 때문입니다. 리터럴 0을 터미널에 보내면 텍스트가 '바이너리'(적어도 OS X의 터미널이 경고하는 것임)라고 가정하고 따라서 인코딩으로 텍스트를 변환하려고 시도합니다. 유니 코드 16 비트 이것은 '가능성이있다', beca 라틴 문자로 사용하면 많은 문자가 16 비트 코드에 0을 갖습니다. 이러한 한자의 유니 코드 값을 선택하면

, 당신은 당신이 원하는 8 비트 문자의 진수 코드를 포함하는 것

效 = U+6548 
汬 = U+6C6C 
潷 = U+6F77 
汲 = U+6C72 

을 찾을 수 있습니다. 귀하의 터미널이 "유효하지 않은"유니 코드 문자를 표시하기를 거부하기 때문에 U+0020이이 목록에없는 것으로 의심됩니다.


하나의 문자를 적게 쓰는 것을 잊어 버렸습니다. 또는 더 명확한 것은 strlen(buf) 문자를 쓰십시오.

관련 문제