将二进制文件读入同一

时间:2015-06-05 00:32:53

标签: c arrays image binary unsigned

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

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

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

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

图像文件名:data.txt Image File Contents

我的代码:

#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 个答案:

答案 0 :(得分:0)

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

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

您将art声明为unsigned char,但是您正在为其指定一个指向unsigned char的指针。这是不正确的:art应该用星号声明。

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

以下是一些补充说明:

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