如何将0x00写入文件

4

我正在编写一个应用程序,它将与我的自定义USB串口设备进行通信(仅写入)。这是一个Cocoa(OS X)应用程序,与此写入相关的部分采用POSIX风格编码。

我已经解决了大部分问题,但存在空(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个回答

4
尝试使用fwrite代替。它允许您指定写入流的字节数。或者循环遍历字符并使用fputc

fputc 只有在以下情况下才有用:a)你喜欢让你的代码运行缓慢,或者b)你需要取其地址。否则使用 putc(同样适用于 fgetc 和 getc …… 幸运的是,在这些后来的日子里,人们不会搞砸 fgetchar 的存在理由已被遗忘的情况)。 - Jim Balter
@JimBalter 当然可以,但是OP有一个包含5个字符的数组。 - DrummerB
@JimBalter在这种情况下,C语言并没有规定任何关于速度的要求。事实上,它为优化留下了充足的空间:“符合实现的最低要求是:……在程序终止时,写入文件的所有数据都应与根据抽象语义执行程序所产生的结果相同。” - autistic

3

fputs函数可以处理以NUL结尾的字符串。如果你想要向文件中写入NUL字符,可以使用fwrite函数代替:

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

非常好,感谢您和其他用户提供的类似答案。这对于普通文件是有效的,我需要测试写入到 /dev/cu.myusbdevice 的真实设备。 - mikikg
1
是的,它可以通过写入 /dev/cu.myusbdevice 来工作。问题解决了 ;) - mikikg

3

fputs()函数用于操作以NULL结尾的字符串。C语言中字符串内部不能包含NULL,因为它是字符串的结束符。如果需要在文件中写入NULL字符,可以使用fputc()函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接