2013-05-21 5 views
4

내 사용자 정의 USB 직렬 장치와 통신 (쓰기 전용)하는 응용 프로그램을 작성 중입니다. 그것은 코코아 (OS X) 응용 프로그램이며이 글과 관련된 부분은 POSIX 스타일로 코딩되어 있습니다.0x00을 파일에 쓰는 방법

나는 모든 것을 해결했지만 NULL (0x00) 문자가있는 문제가 있습니다.

예를 들어 파일에 흰색 문자 5 개가 필요하다고 말하면됩니다.

내 코드는 다음과 같다 : 지정된 인덱스

char stringAsChar[5]; 

stringAsChar[0] = 0x77; 
stringAsChar[1] = 0x44; 
stringAsChar[2] = 0x00; //here is an problem 
stringAsChar[3] = 0x05; 
stringAsChar[4] = 0xFF; 
... 
fputs(stringAsChar, file); // write to file 

각 문자는 대상 장치에 일부 레지스터에 대한 데이터를 나타냅니다.

스트림에 데이터로 가질 필요가있는 0x00 문자가 포함되어 있으면 쓰기가 중지됩니다 (0x00은 스트림의 중단으로 해석 됨).

이 문제를 극복하는 방법은 무엇입니까?

답변

3

fputsNUL- 끝나는 문자열과 함께 작동합니다. 파일로 NUL 문자를 작성하려면 대신 fwrite을 사용할 수 있습니다 : A) 당신이 좋아하는 코드가 느리게 실행 또는 b) 당신의 주소를 취할 필요가있는 경우

noOfBytesWritten = fwrite(stringAsChar, 1, noOfBytesToWrite, file); 
+0

위대한, 당신과 비슷한 답변을 다른 모든 사용자에게 감사드립니다. 보통 파일과 마찬가지로 작동하지만 /dev/cu.myusbdevice에 실제 장치를 작성하여 테스트해야합니다. – mikikg

+1

예, /dev/cu.myusb 장치에 쓰면 작동합니다. 문제 해결됨 ;) – mikikg

3

fputs()은 Null로 끝나는 문자열에서 작동합니다. 터미네이터이기 때문에 C 문자열에 NULL을 포함시킬 수 없습니다. fputc()을 사용하여 NULL 바이트를 파일에 쓸 수 있습니다.

4

대신 fwrite을 사용해보세요. 스트림에 기록 된 바이트 수를 지정할 수 있습니다. 또는 문자 위로 반복하고 fputc을 사용하십시오.

+0

fputc에만 유용합니다. 그렇지 않으면 putc을 사용하십시오 (fgetc와 getc는 마찬가지입니다 ... 다행스럽게도 fgetc와 fputc의 존재 이유가 잊혀진이 후반에 사람들이 엉망이되는 fgetchar은 없습니다). –

+0

@JimBalter 물론, OP에는 5 개의 문자 배열이 있습니다. – DrummerB

+0

@JimBalter C는이 시나리오에서 속도와 관련하여 요구 사항을 지정하지 않습니다. 실제로 최적화에 대한 충분한 여지가 있습니다. "준수 구현에 대한 최소한의 요구 사항은 다음과 같습니다. ... 프로그램 종료시 파일에 기록 된 모든 데이터는 추상 의미에 따라 프로그램이 실행되는 결과와 동일해야합니다 ... " – Sebivor