Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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_Fread - Fatal编程技术网

C 解析位图头的字节并使用文件指针保存

C 解析位图头的字节并使用文件指针保存,c,pointers,byte,fread,C,Pointers,Byte,Fread,在我的第一节C编程课上,我正在做我的第一个项目,我对指针感到迷茫。我们将以各种方式改变位图,我很难理解如何使用文件指针来获取我想要使用和操作的字节数据。我知道位图文件头和DIB头结构以及组成它们的值的字节偏移量。但是,我很难理解如何保存这些值,以便以后使用文件指针。因为这是一个项目,我不想要求太多的帮助。以下是我迄今为止的代码以及我尝试捕获部分标题的各种方法: int main(int argc, const char * argv[]){ FILE *fp; char buff

在我的第一节C编程课上,我正在做我的第一个项目,我对指针感到迷茫。我们将以各种方式改变位图,我很难理解如何使用文件指针来获取我想要使用和操作的字节数据。我知道位图文件头和DIB头结构以及组成它们的值的字节偏移量。但是,我很难理解如何保存这些值,以便以后使用文件指针。因为这是一个项目,我不想要求太多的帮助。以下是我迄今为止的代码以及我尝试捕获部分标题的各种方法:

int main(int argc, const char * argv[]){
    FILE *fp;
    char buff[2]; //only trying '2' to try and capture 'BM' at start of file.
    fp = fopen(argv[1], "r+b");
    fseek(fp, 0, SEEK_END);
    long fsize = ftell(fp);
    rewind(fp);

    // this is where I test what to do but can't get it correct
    unsigned short filetype = fgetc(fp);
    printf("First letter of filetype %c\n", filetype); //prints 'B' which is awesome

    //Now I do not understand how to capture both the 'BM'.
    //I've changed to use the fread as follows:
    fread(buff, sizeof(char), 2, fp);
    printf("Captured bytes with fread %s\n", buff) //this prints 4 char's and not 2? 

    fclose(fp);
    return 0;
}
我还测试了一个简单的while循环,以遍历整个文件并打印每个字符,直到使用
fgetc
遇到
EOF
,这是有效的。因此,我假设每次调用
fgetc
都会将指针的位置从当前字节位置更改为当前位置+1

我想我还没有完全掌握如何使用文件指针将大量字节保存到单个存储变量中。我还尝试了
fseek
fgets
,但没有成功

我非常感谢这里的社区对我的帮助和投入

printf(“%s”,buff)
打印由
buff
指向的字符和后续字符,直到到达NUL字符。不幸的是,
buff
只包含
B
M
,因此
printf
一直读取数组的末尾,直到找到NUL为止。那太糟糕了

替换

char buff[2];
fread(buff, sizeof(char), 2, fp);


请注意,
sizeof(char)
保证为
1


请注意,
fgetc
使文件指针超出了
B
,因此,如果您想让
fread
读取
B

来评估您当前的理解:C中的字符串是什么?@immibis字符数组show do函数如
printf
知道结尾在哪里?@immibis null terminated那么为什么要将不包含NUL的数组传递给
printf
?这很有道理。我真的很欣赏你的榜样。这有助于澄清这一点。对您的编辑进行评论:我知道,当我要更改像素数据的值时,我必须在遍历像素数据时不断前进并返回文件指针。我花了很长时间试图掌握如何将标题参数保存到变量以供以后使用。你和immibis真的帮了大忙。我很确定你会明白这一点,但只是确定:)是的!在没有意识到空终止符位之后,你有充分的理由认为我不会明白这一点!哈哈
char buff[3];
size_t num_read = fread(buff, sizeof(char), 3, fp);
buff[num_read] = 0;