我正在完成一项任务,我需要输出如下数据:
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);
答案 0 :(得分:4)
这就是fwrite
的作用。如果您想要格式化输出,那么您可以使用printf
功能。
例如,
for (size_t i = 0; i < imgsize; ++i)
fprintf(fp, "%d ", img[i]);
如果您想在一定数量的条目之后插入换行符,那么您可以为此循环添加逻辑。
NB。正如Joachim Pileborg所指出的,你应该修改你的for
循环,以便它们对从img
复制的不同指针进行操作。否则,您已经忘记了图像存储的实际开始位置。
答案 1 :(得分:1)
fread和fwrite以二进制格式处理数据,即系统可理解的代码。如果使用fwrite
,则应使用fread
,反之亦然。
要在文件中编写正确的数据格式,请使用fprintf
和fscanf
来处理实际格式的数据。
答案 2 :(得分:1)
正如其他人所指出的,fwrite
确实写了&#34;字节&#34;,但那是因为所有文件都只是字节。它是那些字节所代表的数据类型,以及您如何解释这些数据,这一点非常重要。字节可以是文本,也可以是某种二进制编码数据。
尽管@JoachimPileborg在评论中指出了指针错误,但您确实在编写一个看起来像位图图像的文件,每个值一个字节。你确定这不是你在这里尝试做的事吗?大多数图像位图确实写得像这样。
如果您真正想要的实际上是一个文本文件,以文本形式显示整数的表示,那么请尝试fprintf
。
答案 3 :(得分:0)
您可以将格式化数据打印到缓冲区中,然后输出(如二进制
)#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();
}