将数组的内容打印到文件

时间:2012-08-01 01:31:23

标签: pointers buffer

与指针相关的问题。我正在浏览一些示例代码,这些代码目前将数据从名为 dataFile 的文件读入缓冲区。读取在循环内完成,如下所示:

unsigned char* buffer = (unsigned char*)malloc(1024*768*);
fread(buffer,1,1024*768,dataFile);
redPointer = buffer;
bluePointer = buffer+1024;
greenPointer = buffer+768;

现在,我想尝试将数组缓冲区整个内容写入文件,这样我就可以保存那些离散的图像(而不是大文件)。但是,我不完全确定如何做到这一点。

我正在尝试cout语句,但是我在控制台上打印出垃圾字符,并且还发出了PC声。那么我就结束了我的计划。

除此之外还有其他替代方法:

for (int i=0; i < (1024*768); i++) {
fprintf(myFile, "%6.4f , ", buffer[i]); 
}

1 个答案:

答案 0 :(得分:1)

通过将缓冲区声明为char*,任何指针算术或数组索引都将使用sizeof(char)来计算偏移量。 char是1个字节(8位)。

我不确定你要对缓冲区中的数据做些什么。以下是一些想法:

以十进制格式打印每个字节的值,编码为ASCII文本:

for (int i=0; i < (1024*768); i++) {
    fprintf(myFile, "%d , ", buffer[i]);
}

以十六进制格式打印每个字节的值,以ASCII文本编码:

for (int i=0; i < (1024*768); i++) {
    fprintf(myFile, "%x , ", buffer[i]);
}

打印每个浮点数的值,以十进制表示,以ASCII文本编码(我认为我的数组索引的计算是正确的,以处理每个浮点数的相邻非重叠内存位置)

for (int i=0; i < (1024*768); i += sizeof(float)) {
    fprintf(myFile, "%6.4f , ", buffer[i]);
}

将缓冲区拆分为三个文件,每个文件来自缓冲区的非重叠部分:

fwrite(redPointer, sizeof(char), 768, file1);
fwrite(greenPointer, sizeof(char), 1024-768, file2);
fwrite(bluePointer, sizeof(char), (1024*768)-1024, file3);

fwrite的参考。请注意,对于count参数,我只需对您在问题中硬编码的偏移进行硬编码。还可以减去某些指针以计算每个区域中的字节数。另请注意,如果这些文件是原始数据的明显独立部分,则这三个文件的内容才是明智的。

也许这会给你一些想法。

更新:所以我创建了一个完整的程序来编译和测试格式化行为。这仅打印缓冲区中的前20个项目。它编译(使用gcc -std=c99)并运行。我使用/tmp/data创建了文件ghex,只是填写了一些随机数据。

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

int main()
    {
    FILE* dataFile = fopen("/tmp/data", "rb");
    if (dataFile == NULL)
        {
        printf("fopen() failed");
        return -2;
        }

    unsigned char* buffer = (unsigned char*)malloc(1024*768);
    if (buffer == NULL)
        {
        printf("malloc failed");
        return -1;
        }

    const int bytesRead = fread(buffer,1,1024*768,dataFile);
    printf("fread() read %d bytes\n", bytesRead);

    // release file handle
    fclose(dataFile); dataFile = NULL;

    printf("\nDecimal:\n");
    for (int i=0; i < (1024*768); i++) {
        printf("%hd , ", buffer[i]);
        if (i > 20) { break; }
    }
    printf("\n");

    printf("\nHexadecimal:\n");
    for (int i=0; i < (1024*768); i++) {
        printf("%#0hx , ", buffer[i]);
        if (i > 20) { break; }
    }
    printf("\n");

    printf("\nFloat:\n");
    for (int i=0; i < (1024*768); i += sizeof(float)) {
        printf("%6.4f , ", (float)buffer[i]);
        if (i > 20) { break; }
    }
    printf("\n");

    return 0;
    }