fwrite写出字节,而不是实际的整数

时间:2014-09-16 02:48:46

标签: 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 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);

4 个答案:

答案 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,反之亦然。

要在文件中编写正确的数据格式,请使用fprintffscanf来处理实际格式的数据。

答案 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();
}