Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fwrite写出字节,而不是实际的整数_C_File Io - Fatal编程技术网

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更合适?