Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从文件中读取头节_C_Pointers_Byte_Bmp - Fatal编程技术网

C 从文件中读取头节

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

各位好,飞越者

我正在用C代码做一个小爱好项目,我想对.BMP文件做一些处理。 所以我使用这个维基百科页面

但很快我就遇到了一个问题。 我试图读取文件的前14个字节,位图文件头。 但是当我打印读取的字节时,它们的长度只有8字节?这是因为其他字节为零还是我做错了什么

来自GDB:

(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
的返回值以查看读取了多少元素。还有,考虑到