通过声明您的缓冲区作为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;
}
该文件是否包含字符或字节?如果它们不是字符,那么它在控制台上看起来就像是垃圾。如果他们是图像,那么他们(几乎总是 - XPM是一个例外)而不是字符。我也很好奇你的三个指针:它们指向缓冲区的重叠部分,除非'redPointer'和'greenPointer'用于识别比'bluePointer'更短的部分。 – dsh 2012-08-01 01:43:45
该文件是非人类可读的二进制文件。所以我认为它是字节?对于重叠区域你是对的。这是确定一个较短的部分。这就是说,你会建议一种将内容保存到文件的替代方法吗?最好没有for循环? – c0d3rz 2012-08-01 01:53:06
for循环适用于处理文件。所以你有字节,而不是字符。打印它们不会产生任何可读性。数据的明智处理完全取决于数据的实际内容。嗯,我只注意到,虽然你迭代缓冲区中的每个字节,你有一个格式字符串,期望浮动(通常是4或8字节)。 – dsh 2012-08-01 02:23:01