【问题标题】:Unsigned Char is (null) after reading the binary file into the same将二进制文件读入同一个文件后,Unsigned Char 为 (null)
【发布时间】:2015-08-19 19:27:31
【问题描述】:

我必须打开/读取一个 ascii 艺术文件(图片) 并要求我将图像的宽度和高度返回给主程序,然后要求我通过指针将图片数据传回。这是我必须使用的函数原型:

unsigned char *foo(char *filename, int *width, int *height)

在 foo 内部,我必须使用一个动态的字符数组 存储图像数据。我需要使用 fread() 来阅读 那个数据。我还必须考虑每行末尾的回车。

打开并读取数据后,将其传回主程序。然后主程序必须创建一个动态二维数组来存储图像,复制一维数组 进入二维数组,并将图像显示在屏幕上。

图像文件名:data.txt

我的代码:

#include <stdio.h>
#include <stdlib.h>

void readDimension(FILE *inFile, int *width, int *height)
{
    int i;
    for (i = 0; i < 2; i++)
    {
        if (i == 0)
        {
            fscanf(inFile, "%d", width);
        }
        if (i == 1)
        {
            fscanf(inFile, "%d", height);
        }
    }
}

unsigned char *foo(char *filename, int *width, int *height)
{   
    FILE *inFile = fopen(filename, "rb");

    readDimension(inFile, width, height);

    unsigned char *ret = malloc(*width * *height); 

    fread(ret, 1, *width * *height, inFile); 

    fclose(inFile); 

    return ret;
}

int main(int argc, char** argv)
{
    FILE *inFile;
    int width, height;
    unsigned char art;



    if (argc == 1)
    {
        printf("Please specify a file name.\n");
    }
    else if (argc == 2)
    {
        inFile = fopen(argv[1], "rb");
        if (inFile != NULL)
        {
            fclose(inFile);

            art = foo(argv[1], &width, &height);
            int n = sizeof(art);
            printf("Data in Array: \\%c \n", art);
            printf("Size of Array: %d \n", n); 
        }
        else
        {
            printf("Error: File Not Found %s", argv[1]);
        }   
    }

    printf("Width: %d\n", width); // Testing
    printf("Height: %d\n", height); // Testing
}

【问题讨论】:

  • 1) unsigned char art; 应该是 unsigned char *art;
  • 2) fscanf(inFile, "%d", height); --> fscanf(inFile, "%d%*c", height);
  • @BLUEPIXY 为什么是%*c
  • %*c 跳过换行符。
  • 郑重声明,您的文件是 text 文件,而不是二进制文件。 “ASCII”可能是您的第一个线索,处理行终止符的需要当然应该达成交易。

标签: c arrays image binary unsigned


【解决方案1】:

问题是您试图获取art 的大小,这是一个指针。它有固定的大小。大小应计算为width*height:

printf("Size of Array: %d x %d (%d)\n", width, height, width*height);

您将art 声明为unsigned char,但您为其分配了一个指向无符号字符的指针。这是不正确的:art 应该用星号声明。

在传递数组art 时,您还打印了单个字符%c。这不会打印任何感兴趣的东西。如果要打印第一个字符,请打印art[0]。如果要打印整张图片,请创建一对嵌套循环,遍历widthheight,打印每个字符,并在每行之后打印'\n'

以下是一些附加说明:

  • 您不应该使用fread 一次性读取整个文件,因为它会将\ns 引入数据中。相反,您应该逐行阅读文件。
  • 您可以在读取数据的同一函数中读取宽度和高度
  • 您不需要循环来读取两个整数。您可以在一行中完成,如下所示:fscanf(inFile, "%d %d", width, height);

【讨论】:

  • 其实art只是一个unsigned char,根本不是数组或指针,这是一个严重的错误。
  • @DavidK 我已经考虑到这一点并将art转换为*art
猜你喜欢
  • 2020-08-10
  • 2016-03-30
  • 1970-01-01
  • 2016-02-29
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多