C 从文件中读取头节
各位好,飞越者 我正在用C代码做一个小爱好项目,我想对.BMP文件做一些处理。 所以我使用这个维基百科页面 但很快我就遇到了一个问题。 我试图读取文件的前14个字节,位图文件头。 但是当我打印读取的字节时,它们的长度只有8字节?这是因为其他字节为零还是我做错了什么 来自GDB:C 从文件中读取头节,c,pointers,byte,bmp,C,Pointers,Byte,Bmp,各位好,飞越者 我正在用C代码做一个小爱好项目,我想对.BMP文件做一些处理。 所以我使用这个维基百科页面 但很快我就遇到了一个问题。 我试图读取文件的前14个字节,位图文件头。 但是当我打印读取的字节时,它们的长度只有8字节?这是因为其他字节为零还是我做错了什么 来自GDB: (gdb) p pImageHeader $3 = 0x602250 "BMz\270\v" (gdb) x pImageHeader 0x600x602250: 0xb87a4d42 这是我的密码: #inc
(gdb) p pImageHeader
$3 = 0x602250 "BMz\270\v"
(gdb) x pImageHeader
0x600x602250: 0xb87a4d42
这是我的密码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
// If arguments are less than 2, just quit and tell user how do use the god damn program!
if (argc < 2)
{
printf("Usage : %s xxxx.bmp \n", argv[0]);
exit(1);
}
// Create file pointer and attach it to argument file location
FILE* pImageFile;
pImageFile = fopen(argv[1], "r");
// if file doesn't open, quit the program
if (pImageFile == NULL)
{
printf("Some error occured openening file : %s \n", argv[1]);
exit(1);
}
char* pImageHeader;
pImageHeader = malloc(sizeof(char) * 14);
if (pImageHeader == NULL)
{
printf("Error asking for RAM \n");
exit(1);
}
const int HEADER_SIZE = 14;
size_t bytes_read = fread(pImageHeader, 1, HEADER_SIZE, pImageFile);
if (bytes_read < HEADER_SIZE)
{
printf("Something went wrong reading file header! \n");
exit(1);
}
int i = 0;
for (i; i != 14; i++)
{
printf("%02X ", pImageHeader[i]);
}
printf(" \n");
return 0;
}
#包括
#包括
int main(int argc,char*argv[])
{
//如果参数小于2,请退出并告诉用户如何使用这个该死的程序!
如果(argc<2)
{
printf(“用法:%s xxxx.bmp\n”,argv[0]);
出口(1);
}
//创建文件指针并将其附加到参数文件位置
文件*pImageFile;
pImageFile=fopen(argv[1],“r”);
//如果文件未打开,请退出程序
如果(pImageFile==NULL)
{
printf(“打开文件时发生错误:%s\n”,argv[1]);
出口(1);
}
char*pImageHeader;
pImageHeader=malloc(大小(字符)*14);
如果(pImageHeader==NULL)
{
printf(“请求RAM时出错\n”);
出口(1);
}
const int HEADER_SIZE=14;
size\u t bytes\u read=fread(pImageHeader,1,HEADER\u size,pImageFile);
if(字节读取<标题大小)
{
printf(“读取文件头时出错!\n”);
出口(1);
}
int i=0;
对于(i;i!=14;i++)
{
printf(“%02X”,pImageHeader[i]);
}
printf(“\n”);
返回0;
}
编辑:
更改源代码以检查实际读取的字节数。它通过,所以它读取14个字节 您的代码很好。您的调试命令不可用
(gdb) p pImageHeader
$3 = 0x602250 "BMz\270\v"
由于pImageHeader
是一个char*
,GDB假定它是一个以NUL结尾的“C字符串”,当您说p
时,它会尝试将其打印成这样。如果前14个字节中有NUL
字节,GDB将停止在那里打印字符
相反,请尝试x/14xb pImageHeader
。这将从指针pImageHeader
打印14十六进制字节
当然,您还应该特别参考GDB的文档
我的:
#包括
#包括
int main()
{
char*p=malloc(20);
memcpy(p,“测试工作”,12);
返回0;
}
GDB:
(gdb)打印p
$1=0x601010“测试”您的代码很好。您的调试命令不可用
(gdb) p pImageHeader
$3 = 0x602250 "BMz\270\v"
由于pImageHeader
是一个char*
,GDB假定它是一个以NUL结尾的“C字符串”,当您说p
时,它会尝试将其打印成这样。如果前14个字节中有NUL
字节,GDB将停止在那里打印字符
相反,请尝试x/14xb pImageHeader
。这将从指针pImageHeader
打印14十六进制字节
当然,您还应该特别参考GDB的文档
我的:
#包括
#包括
int main()
{
char*p=malloc(20);
memcpy(p,“测试工作”,12);
返回0;
}
GDB:
(gdb)打印p
$1=0x601010“测试”您的代码很好。您的调试命令不可用
(gdb) p pImageHeader
$3 = 0x602250 "BMz\270\v"
由于pImageHeader
是一个char*
,GDB假定它是一个以NUL结尾的“C字符串”,当您说p
时,它会尝试将其打印成这样。如果前14个字节中有NUL
字节,GDB将停止在那里打印字符
相反,请尝试x/14xb pImageHeader
。这将从指针pImageHeader
打印14十六进制字节
当然,您还应该特别参考GDB的文档
我的:
#包括
#包括
int main()
{
char*p=malloc(20);
memcpy(p,“测试工作”,12);
返回0;
}
GDB:
(gdb)打印p
$1=0x601010“测试”您的代码很好。您的调试命令不可用
(gdb) p pImageHeader
$3 = 0x602250 "BMz\270\v"
由于pImageHeader
是一个char*
,GDB假定它是一个以NUL结尾的“C字符串”,当您说p
时,它会尝试将其打印成这样。如果前14个字节中有NUL
字节,GDB将停止在那里打印字符
相反,请尝试x/14xb pImageHeader
。这将从指针pImageHeader
打印14十六进制字节
当然,您还应该特别参考GDB的文档
我的:
#包括
#包括
int main()
{
char*p=malloc(20);
memcpy(p,“测试工作”,12);
返回0;
}
GDB:
(gdb)打印p
$1=0x601010“测试”您应该检查fread
的返回值以查看读取了多少个元素。此外,考虑在你的问题中包含你的代码的最小样本/例子,这样人们就不必跟随你的链接。谢谢你的快速响应,我将尽快更新我的代码。也可以看到关于< Cult> MalOC 的铸造。如果您没有stdlib.h
,这也可能是您的问题。您应该检查fread
的返回值以查看读取了多少元素。此外,考虑在你的问题中包含你的代码的最小样本/例子,这样人们就不必跟随你的链接。谢谢你的快速响应,我将尽快更新我的代码。也可以看到关于< Cult> MalOC 的铸造。如果您没有stdlib.h
,这也可能是您的问题。您应该检查fread
的返回值以查看读取了多少元素。此外,考虑在你的问题中包含你的代码的最小样本/例子,这样人们就不必跟随你的链接。谢谢你的快速响应,我将尽快更新我的代码。也可以看到关于< Cult> MalOC 的铸造。如果您没有stdlib.h
,这也可能是您的问题。您应该检查fread
的返回值以查看读取了多少元素。还有,考虑到