fwrite 输出字节为短
fwrite outputting byte as a short
我正在尝试将以下数组写入文件:
char * data = malloc(4);
data[0] = 0x6f;
data[1] = 0x45;
data[2] = 0x23;
data[3] = 0x01;
开启密码:
FILE *fp = fopen("output.txt", "wb");
if (fp != NULL){
...
我尝试过以这些方式输出数据:
fwrite(data, 4, sizeof(char), fp);
fwrite(data, sizeof(char), 4, fp);
for(i = 0; i < 4; i++){
fwrite(data + i, 1, 1, fp);
}
...
但是我使用 fwrite 的每一种方式我的输出文件都是这样的:
hexdump output.txt
0000000 060f 0405 0203 0001
编辑: 供参考,我希望输出如下所示:
0000000 6f45 2301
结束编辑
关闭代码:
fclose(fp);
有人可以在我发疯之前向我解释发生了什么吗?
编辑:我是个白痴。谢谢你试图帮助我。数据的生成方式我 认为 容器如上,但实际上每个字符都获得了十六进制的一部分。 IE。 data[0] 是 0x6,data[1] 是 0xf。所以fwrite在写入文件的时候,只是在空隙中写入,0xf实际上是0x0f等等。抱歉浪费大家的时间。
我会怀疑你的系统编码?这是我的测试,它生成了预期的输出
#include "stdio.h"
int main() {
char buffer[] = {0x6f, 0x45, 0x23, 0x01};
FILE * pFile = fopen ("out.bin", "wb");
fwrite (buffer , sizeof(char), sizeof(buffer), pFile);
fclose (pFile);
return (0);
}
输出为
00000000: 6f45 2301 oE#.
不清楚你的问题具体出在哪里。分配和分配产生所需的输出。缺少的是验证您尝试的实际成功。
例如,以下代码(使用您的分配、赋值和 fwrite)产生了您想要的输出:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv) {
size_t n;
char *data = malloc (4);
FILE *fp = argc > 1 ? fopen (argv[1], "wb") : stdout;
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
if (!data) { /* validate allocation succeeded */
fprintf (stderr, "error: virtual memory exhausted.\n");
return 1;
}
data[0] = 0x6f;
data[1] = 0x45;
data[2] = 0x23;
data[3] = 0x01;
/* write / validate write size */
if ((n = fwrite (data, sizeof *data, 4, fp)) != 4) {
fprintf (stderr, "error: fwrite failure.\n");
return 1;
}
if (fclose (fp) == EOF) { /* validate close after write */
fprintf (stderr, "error: on file stream close.\n");
return 1;
}
free (data);
return 0;
}
示例输出文件
$ ./bin/frwitebytes dat/databytes.dat
$ hexdump -Cv dat/databytes.dat
00000000 6f 45 23 01 |oE#.|
00000004
或者正是您正在寻找的 hexdump
格式:
$ hexdump dat/databytes.dat
0000000 456f 0123
0000004
检查一下,如果我误解了你的问题,请告诉我。
我正在尝试将以下数组写入文件:
char * data = malloc(4);
data[0] = 0x6f;
data[1] = 0x45;
data[2] = 0x23;
data[3] = 0x01;
开启密码:
FILE *fp = fopen("output.txt", "wb");
if (fp != NULL){
...
我尝试过以这些方式输出数据:
fwrite(data, 4, sizeof(char), fp);
fwrite(data, sizeof(char), 4, fp);
for(i = 0; i < 4; i++){
fwrite(data + i, 1, 1, fp);
}
...
但是我使用 fwrite 的每一种方式我的输出文件都是这样的:
hexdump output.txt
0000000 060f 0405 0203 0001
编辑: 供参考,我希望输出如下所示:
0000000 6f45 2301
结束编辑
关闭代码:
fclose(fp);
有人可以在我发疯之前向我解释发生了什么吗?
编辑:我是个白痴。谢谢你试图帮助我。数据的生成方式我 认为 容器如上,但实际上每个字符都获得了十六进制的一部分。 IE。 data[0] 是 0x6,data[1] 是 0xf。所以fwrite在写入文件的时候,只是在空隙中写入,0xf实际上是0x0f等等。抱歉浪费大家的时间。
我会怀疑你的系统编码?这是我的测试,它生成了预期的输出
#include "stdio.h"
int main() {
char buffer[] = {0x6f, 0x45, 0x23, 0x01};
FILE * pFile = fopen ("out.bin", "wb");
fwrite (buffer , sizeof(char), sizeof(buffer), pFile);
fclose (pFile);
return (0);
}
输出为
00000000: 6f45 2301 oE#.
不清楚你的问题具体出在哪里。分配和分配产生所需的输出。缺少的是验证您尝试的实际成功。
例如,以下代码(使用您的分配、赋值和 fwrite)产生了您想要的输出:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv) {
size_t n;
char *data = malloc (4);
FILE *fp = argc > 1 ? fopen (argv[1], "wb") : stdout;
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
if (!data) { /* validate allocation succeeded */
fprintf (stderr, "error: virtual memory exhausted.\n");
return 1;
}
data[0] = 0x6f;
data[1] = 0x45;
data[2] = 0x23;
data[3] = 0x01;
/* write / validate write size */
if ((n = fwrite (data, sizeof *data, 4, fp)) != 4) {
fprintf (stderr, "error: fwrite failure.\n");
return 1;
}
if (fclose (fp) == EOF) { /* validate close after write */
fprintf (stderr, "error: on file stream close.\n");
return 1;
}
free (data);
return 0;
}
示例输出文件
$ ./bin/frwitebytes dat/databytes.dat
$ hexdump -Cv dat/databytes.dat
00000000 6f 45 23 01 |oE#.|
00000004
或者正是您正在寻找的 hexdump
格式:
$ hexdump dat/databytes.dat
0000000 456f 0123
0000004
检查一下,如果我误解了你的问题,请告诉我。