Pointers 将数组的内容打印到文件

Pointers 将数组的内容打印到文件,pointers,buffer,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; 现在,我想尝试将数组缓冲区的整个

与指针相关的问题。我将介绍一些示例代码,这些代码当前将数据从名为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]); 
}
for(int i=0;i<(1024*768);i++){
fprintf(我的文件,“%6.4f”,缓冲区[i]);
}

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

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

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

for(int i=0;i<(1024*768);i++){
fprintf(我的文件,“%d”,缓冲区[i]);
}
以十六进制打印每个字节的值,以ASCII文本编码:

for(int i=0;i<(1024*768);i++){
fprintf(我的文件,“%x”,缓冲区[i]);
}
打印每个浮点数的值(十进制),用ASCII文本编码(我认为我对数组索引的计算是正确的,可以为每个浮点数处理相邻的非重叠内存位置):

for(int i=0;i<(1024*768);i+=sizeof(float)){
fprintf(我的文件,“%6.4f”,缓冲区[i]);
}
将缓冲区拆分为三个文件,每个文件来自缓冲区的非重叠部分:

fwrite(红指针,sizeof(char),768,file1);
fwrite(greenPointer,sizeof(char),1024-768,file2);
fwrite(bluePointer,sizeof(char),(1024*768)-1024,file3);
参考。请注意,对于
count
参数,我只是硬编码了您在问题中硬编码的偏移量。还可以减去某些指针来计算每个区域中的字节数。还要注意的是,只有当这三个文件是原始数据的独立部分时,它们的内容才有意义

也许这会给你一些想法

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

#包括
#包括
int main()
{
FILE*dataFile=fopen(“/tmp/data”,“rb”);
如果(数据文件==NULL)
{
printf(“fopen()失败”);
返回-2;
}
无符号字符*缓冲区=(无符号字符*)malloc(1024*768);
if(buffer==NULL)
{
printf(“malloc失败”);
返回-1;
}
const int bytesRead=fread(缓冲区,11024*768,数据文件);
printf(“fread()读取%d字节\n”,字节读取);
//释放文件句柄
fclose(数据文件);数据文件=NULL;
printf(“\n抽样:\n”);
对于(int i=0;i<(1024*768);i++){
printf(“%hd”,缓冲区[i]);
如果(i>20){break;}
}
printf(“\n”);
printf(“\nHexadecimal:\n”);
对于(int i=0;i<(1024*768);i++){
printf(“%#0hx,”,缓冲区[i]);
如果(i>20){break;}
}
printf(“\n”);
printf(“\n贷款:\n”);
对于(int i=0;i<(1024*768);i+=sizeof(float)){
printf(“%6.4f,”,(浮点)缓冲区[i]);
如果(i>20){break;}
}
printf(“\n”);
返回0;
}

文件包含字符还是字节?如果它们不是字符,那么在控制台上看起来就像垃圾。如果它们是图像,那么它们(几乎总是-XPM是一个例外)不是字符。我对你的三个指针也很好奇:它们指向缓冲区的重叠部分,除非
redPointer
greenPointer
用于标识比
bluePointer
更短的部分。该文件是非人类可读的二进制文件。所以我假设它是字节?关于重叠区域,你是对的。这是为了确定一个较短的部分。话虽如此,您是否建议将内容保存到文件中的另一种方法?最好没有for循环?for循环适合处理文件。所以你有字节,而不是字符。打印它们不会产生任何可读性。数据的合理处理将完全取决于数据的实际内容。嗯,我刚刚注意到,虽然您在迭代缓冲区中的每个字节,但是您有一个需要浮点的格式字符串(通常是4或8个字节)。出于某种原因,它只是将0.0000作为所有元素打印到文件中。不知道为什么。我最初认为这是因为我通过值访问缓冲区。我改为通过引用&buffer[I]对其进行更改,但得到相同的结果。我不知道关于花车的事。那么,您建议如何将其转换为字节呢?调用
malloc()
会将整个缓冲区初始化为全零。
fread()
是否确实从文件中读取了任何内容?非常感谢dsh。当我以十进制打印字节值时,我能够获得一些非零数据。我将尝试深入挖掘代码,以了解正在发生的事情并发回。一旦我弄清楚发生了什么事,我会接受你的回答/以防我需要提出后续问题。不客气。在我运行的代码的一些变体中,我确实看到了0.000输出。我真的不知道为什么。我还看到其中一个,只有每4个字节被打印,没有十进制数字。在这种情况下,编译器将数组中的1字节字节转换为sta上的4字节浮点