如何解决无论我在fopen中使用哪种模式打开文件,fprintf均以文本格式写入数据
尝试使用fprintf()
以二进制模式存储int,但是无论我在fopen()
中指定哪种模式,它都仅以文本格式写入int值。另一方面,当我使用fwrite
代替fprintf
时,它以二进制格式存储int。那么我们可以在二进制模式下使用fprintf
吗?
#include <stdio.h>
int main()
{
FILE *fp;
fp = fopen("abc.bin","wb");
int num = 69;
fprintf(fp,"%d",num);
fclose(fp);
return 0;
}
此外,如果我们谈论其他I / O功能,那么哪些功能可以完美地与二进制模式配合使用?有关此类行为的任何正式记录吗?
我正在mingw下的Windows平台上工作。
解决方法
fprintf()
用于将int
参数转换为人类可读的格式。要将二进制数据存储到文件中,实际上必须使用"wb"
或"ab"
以二进制模式打开它,并且可以使用fwrite
或putc
:
int n = 1234;
if (fwrite(&n,sizeof(n),1,fp) == 1) {
// n was successfully written to fp
}
fwrite
使用正在运行的系统中使用的表示形式和字节顺序存储int
值。如果可以将文件传输到其他系统以在此处读取,则必须指定文件中使用的字节顺序和表示形式,并以可移植的方式实现读写功能:
#include <stdio.h>
#include <stdint.h>
int write_int32_le(int n,FILE *fp) {
/* write the int as a 4 byte little endian two's complement representation */
uint32_t u32 = n;
int res = 4;
for (int i = 0; i < 4; i++) {
if (putc(u32 & 255,fp) == EOF)
res = EOF;
u32 >>= 8;
}
return res;
}
int read_int32_le(FILE *fp) {
/* write the int as a 4 byte little endian two's complement representation */
uint32_t u32 = 0;
for (int i = 0; i < 4; i++) {
int c = getc(fp);
if (c == EOF)
return EOF;
u32 |= (uint32_t)c << (i << 3);
}
return (int)u32;
}
您的二进制文件中也可以使用其他表示形式,例如big-endian或LEB128
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。