与指针相关的问题。我正在浏览一些示例代码,这些代码目前将数据从名为 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]);
}
答案 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;
}