C fwrite写出字节,而不是实际的整数
我正在完成一项任务,其中我需要输出如下数据:C fwrite写出字节,而不是实际的整数,c,file-io,C,File Io,我正在完成一项任务,其中我需要输出如下数据: 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 首先想到的是一次输出一个像素,但我的教授希望我使用fwrite一次输出所有像素 每次使用fwrite时,我的输出都是实际的字节,而不是整数 我怎样才能解决这个问题 int rows = 3; int cols = 3; int imgsize = (3 * rows * cols); unsigned ch
255 0 0 255 0 0 255 0 0
255 0 0 255 0 0 255 0 0
255 0 0 255 0 0 255 0 0
首先想到的是一次输出一个像素,但我的教授希望我使用fwrite一次输出所有像素
每次使用fwrite时,我的输出都是实际的字节,而不是整数
我怎样才能解决这个问题
int rows = 3;
int cols = 3;
int imgsize = (3 * rows * cols);
unsigned char *img = malloc(imgsize);
int ri = 0;
int ci = 0;
for (ri = 0; ri < rows; ri++) {
for (ci = 0; ci < cols; ci++) {
*img = 255;
*(img + 1) = 0;
*(img + 2) = 0;
img += 3;
}
}
FILE *fp = fopen("output", "w");
fwrite(img, 1, imgsize, fp);
fclose(fp);
福瑞特就是这么做的。如果需要格式化输出,则可以使用printf函数
比如说,
for (size_t i = 0; i < imgsize; ++i)
fprintf(fp, "%d ", img[i]);
如果您想在一定数量的条目之后插入换行符,那么您可以为此向该循环添加逻辑
注意。正如Joachim Pileborg所指出的,您应该修改for循环,以便它们在从img复制的不同指针上操作。否则,您将无法知道图像存储的起始位置。fread和fwrite以二进制格式处理数据,即系统可理解的代码。如果使用fwrite,则应使用fread,反之亦然
要在文件中写入正确格式的数据,请使用fprintf和fscanf,它们以实际格式处理数据。正如其他人所指出的,fwrite确实写入字节,但这是因为所有文件都只是字节。重要的是这些字节所代表的数据类型,以及如何解释它们。字节可以是文本,也可以是某种二进制编码的数据 尽管@JoachimPileborg在评论中指出了指针错误,但您确实在将看起来像位图的图像写入文件,每个值一个字节。你确定这不是你想要做的吗?大多数图像位图确实是这样写的
如果您真正想要的是一个文本文件,它以文本形式显示整数的表示形式,那么确实可以尝试使用fprintf 您可以将格式化数据打印到缓冲区中,然后像二进制一样输出
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>
#include <string.h>
void main() {
FILE *out = NULL;
char buffer[1024];
int num255, num0;
int length;
out = fopen("C:/c/bintxt.txt", "wb");
if (out == NULL) {
exit(EXIT_FAILURE);
}
num255 = 255;
num0 = 0;
sprintf(buffer, "%d %d %d %d %d %d\0", num255, num0, num0, num255, num0, num0);
length = strlen(buffer);
fwrite(buffer, 1, length, out);
fclose(out);
//_getch();
}
输出是什么样子的?您的代码中有,因为您在循环中更改了指针img,所以当循环完成时,您不再具有原始指针。这意味着您正在编写不确定的看似随机的二进制数据的imgsize字节。要么您误解了您的赋值,要么编写您的赋值的人不理解C。fwrite输出字节,这就是它的用途。您不需要解决这个问题。对于这个用例,也许fprintf比printf更合适?