2012-08-01 68 views
0

与指针相关的问题。我正在浏览一些示例代码,该代码当前将数据从名为dataFile的文件中读入到缓冲区中。阅读是一个循环内完成如下:将数组的内容打印到文件

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

现在,我想尝试缓冲写入阵列的整个内容到一个文件,这样我可以只保存那些离散的图像(并没有一个大文件)。但是,我不完全知道如何去做这件事。

我正在试图陈述语句,但是我在控制台上得到了一个垃圾字符的打印输出,并且还从PC发出一声嘟嘟声。那么我结束我的程序。

是否有比这以外的另一种方法:

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

该文件是否包含字符或字节?如果它们不是字符,那么它在控制台上看起来就像是垃圾。如果他们是图像,那么他们(几乎总是 - XPM是一个例外)而不是字符。我也很好奇你的三个指针:它们指向缓冲区的重叠部分,除非'redPointer'和'greenPointer'用于识别比'bluePointer'更短的部分。 – dsh 2012-08-01 01:43:45

+0

该文件是非人类可读的二进制文件。所以我认为它是字节?对于重叠区域你是对的。这是确定一个较短的部分。这就是说,你会建议一种将内容保存到文件的替代方法吗?最好没有for循环? – c0d3rz 2012-08-01 01:53:06

+1

for循环适用于处理文件。所以你有字节,而不是字符。打印它们不会产生任何可读性。数据的明智处理完全取决于数据的实际内容。嗯,我只注意到,虽然你迭代缓冲区中的每个字节,你有一个格式字符串,期望浮动(通常是4或8字节)。 – dsh 2012-08-01 02:23:01

回答

1

通过声明您的缓冲区作为char*,任何指针arithmatic或数组索引将使用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)并运行。我使用ghex创建了文件/tmp/data,并且只是填充了一些随机数据。

#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; 
    } 
+0

非常感谢dsh。当我以十进制打印字节值时,我能够获得一些非零数据。我将尝试深入了解代码,以了解发生的情况并发回。一旦我弄清楚发生了什么事情,我会尽快接受你的回答,因为我需要提出后续问题。 – c0d3rz 2012-08-01 23:31:43

+1

不客气。随着我运行的代码的一些变化,我看到0.000输出。我不知道为什么。我还看到其中一个人只有每四个字节都打印出没有十进制数字。在这种情况下,事实证明,在调用printf()之前,编译器会将数组中的1字节字节转换为堆栈上的4字节浮点数。我尝试了一些其他的操作,需要4个字节,并把它们看作是一个没有我所寻找的结果的浮点数。一般来说,我会避免混合字节和浮点数,而不完全确定你想在那里做什么。 – dsh 2012-08-02 01:25:15

+0

非常感谢dsh,我想我对发生的事情有了更好的了解。我仍然会深入一点,非常感谢您的帮助! – c0d3rz 2012-08-02 22:49:13