2013-05-21 2 views
4

Я пишу какое-то приложение, которое будет связываться (писать только) с моим пользовательским USB-последовательным устройством. Это приложение Cocoa (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

fputs работает с NUL -строенные строки. Если вы хотите написать NUL символы в файл, который вы можете использовать вместо fwrite:

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

Отлично, спасибо и всем другим пользователям за подобные ответы. Он работает так, как обычно, с обычными файлами, мне нужно протестировать с реальной записью устройства на /dev/cu.myusbdevice. – mikikg

+1

Да, он работает с написанием на /dev/cu.myusbdevice. Задача решена ;) – mikikg

3

fputs() работает с нулевыми символами. У вас не может быть NULL, встроенного в строку C, потому что это терминатор. Вы можете использовать fputc(), чтобы записать NULL-файл в файл.

4

Попробуйте вместо этого использовать fwrite. Он позволяет указать количество байтов, записанных в поток. Или переверните символы и используйте fputc.

+0

fputc полезна только если) вы хотите, чтобы ваш код работать медленно или б) вы должны принять его адрес. В противном случае используйте putc (то же самое для fgetc и getc ... к счастью, в последние дни нет фетчар для людей, которых можно было бы испортить, когда была забыта причина существования fgetc и fputc). –

+0

@JimBalter Конечно, но OP имел массив из 5 символов. – DrummerB

+0

@ JimBalter C не указывает никаких требований относительно скорости в этом сценарии. Фактически, это дает массу возможностей для оптимизации: «Наименьшие требования к соответствующей реализации: ... При завершении программы все данные, записанные в файлы, должны быть идентичны результату, что выполнение программы в соответствии с абстрактной семантикой ... » – Sebivor

Смежные вопросы