fseek头文件(求助c++读取BMP文件)

本文目录
求助c++读取BMP文件
你好,我把问题补充一下,希望对你有帮助。如果还是不行,你再问我。
在你如下的程序段中:
//读取头文件
fseek( rfile , sizeof(short) ,SEEK_SET );
fread( pointfh ,sizeof(BITMAPFILEHEADER) , 1 , rfile );
//读取信息头文件
fseek( rfile , sizeof(BITMAPFILEHEADER)+sizeof(short) ,SEEK_SET );
fread( pointih ,sizeof(BITMAPINFOHEADER),1, rfile );
//读位图信息
pointimage=(char*)calloc(ih.biSizeImage*3, sizeof(char));
fseek(rfile,fh.bfOffBits,SEEK_SET);//头指针移动到位图区
fread(pointimage,sizeof(char),ih.biSizeImage*3,rfile);
第一句中,我觉得不要加sizeof(short),而是将其改为0。因为文件的前sizeof(BITMAPFILEHEADER)个字节就是 文件信息头,紧接其后的sizeof(BITMAPINFOHEADER)个字节是位图信息头,所以在你的第三条语句中,也应去掉sizeof(short)。另外,biSizeImage就是位图像素信息实际占用的存储空间长度,不需要乘以3,所以在上面第5和第7句中应将“*3”去掉。这时你在运行一下试试。
还有,24位位图每个像素用3个字节表示。你的256像素*256像素的图像的实际占用的字节数应是256*256*3 = 196608,这正是biSizeImage的值!
bmp文件分为四个部分:
文件信息头、位图信息头、调色板、位图信息数据。
你在读信息头文件后,应该读调色板数据。对于真彩色图像,因为没有调色板,所以不用读;但对于其他的图像就需要读了。这是你的代码存在的问题之一。解决办法是根据biBitCount的值判断调色板的大小:若biBitCount为1,调色板大小为2*sizeof(RGBQUAD)字节;若为4,调色板16*sizeof(RGBQUAD);若为8,调色板256*sizeof(RGBQUAD);若为24,调色板为0。
另外,位图信息数据每行存储的字节数一定是4字节的整数倍,不足的时候补0。比如你的图像每行只有一个像素,一个像素用三个字节存储,那么在实际存储该图像时需要在每行多补充一个字节,以使其达到4字节的整数倍。biSizeImage的值就是图像信息数据实际存储的字节数,读的时候直接读这么多字节的数据就行了,不需要乘以3。你的代码在读信图信息时并没考虑这一点,这是存在的问题之二。图像每行存储的实际字节数:nBytesPerLine = biSizeImage / biHeight,这个值在后续的处理中可能会用到。
你说读取的分辨率是3780,是指每米有3780个像素,单位是像素/米。而那个96的单位可能不是像素/米。
希望对你有帮助。
对于文件*fp,可以做fp++吗
对于文件*fp,不可以做fp++的。
在顺序读写文件时,读写指针会自动后移的。如果要人工定位读写指针,可以使用如下函数:
函数名:fseek函数
头文件:#include《stdio.h》
功能:把与fp有关的文件位置指针放到一个指定位置。
格式: int fseek(FILE *stream, long offset, int fromwhere);
范例一:fseek(fp, 0L, SEEK_END);
解释:文件指针定位到文件末尾,偏移0个字节
范例二: fseek(fp,50L,0);或fseek(fp,50L,SEEK_SET);
解释:其作用是将位置指针移到离文件头50个字节处。
起始点 对应的数字 代表的文件位置
SEEK_SET 0 文件开头
SEEK_CUR 1 文件当前位置
SEEK_END 2 文件末尾
说明:
offset:偏移量
fromwhere:起始位置
其中,“位移量”是long型数据,它表示位置指针相对于“起始点”移动的字节数。
如果位移量是一个正数,表示从“起始点”开始往文件尾方向移动;
如果位移量是一个负数,则表示从“起始点”开始往文件头方向移动。
“起始点”不能任意设定,它只能是在stdio.h中定义的三个符号常量之一:
注意:
fseek函数的文件指针,应该为已经打开的文件。如果没有打开的文件,那么将会出现错误。
如何在VS2010中创建不带h的c++头文件
C++ 标准头文件 为了 和 C 标准头文件区分开,所以不用 后缀名
重新包装了 C标准头文件 为 前面加c ,比如 cstdio 基本就是原来的 stdio.h
cstdio 头文件的内容,包含了 stdio.h ,
但是原来c里面的函数名字先undef,然后重新定义
比如 #undef printf 再using ::printf;
C/C++ code
#pragma GCC system_header
#include 《bits/c++config.h》
#include 《stdio.h》
#ifndef _GLIBCXX_CSTDIO
#define _GLIBCXX_CSTDIO 1
// Get rid of those macros defined in 《stdio.h》 in lieu of real functions.
#undef clearerr
#undef fclose
#undef feof
#undef ferror
#undef fflush
#undef fgetc
#undef fgetpos
#undef fgets
#undef fopen
#undef fprintf
#undef fputc
#undef fputs
#undef fread
#undef freopen
#undef fscanf
#undef fseek
#undef fsetpos
#undef ftell
#undef fwrite
#undef getc
#undef getchar
#undef gets
#undef perror
#undef printf
#undef putc
#undef putchar
#undef puts
#undef remove
#undef rename
#undef rewind
#undef scanf
#undef setbuf
#undef setvbuf
#undef sprintf
#undef sscanf
#undef tmpfile
#undef tmpnam
#undef ungetc
#undef vfprintf
#undef vprintf
#undef vsprintf
_GLIBCXX_BEGIN_NAMESPACE(std)
using ::FILE;
using ::fpos_t;
using ::clearerr;
using ::fclose;
using ::feof;
using ::ferror;
using ::fflush;
using ::fgetc;
using ::fgetpos;
using ::fgets;
using ::fopen;
using ::fprintf;
using ::fputc;
using ::fputs;
using ::fread;
using ::freopen;
using ::fscanf;
using ::fseek;
using ::fsetpos;
using ::ftell;
using ::fwrite;
using ::getc;
using ::getchar;
using ::gets;
using ::perror;
using ::printf;
using ::putc;
using ::putchar;
using ::puts;
using ::remove;
using ::rename;
using ::rewind;
using ::scanf;
using ::setbuf;
using ::setvbuf;
using ::sprintf;
using ::sscanf;
using ::tmpfile;
using ::tmpnam;
using ::ungetc;
using ::vfprintf;
using ::vprintf;
using ::vsprintf;
_GLIBCXX_END_NAMESPACE
#if _GLIBCXX_USE_C99
#undef snprintf
#undef vfscanf
#undef vscanf
#undef vsnprintf
#undef vsscanf
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
#if _GLIBCXX_USE_C99_CHECK || _GLIBCXX_USE_C99_DYNAMIC
extern "C" int
(snprintf)(char * __restrict, std::size_t, const char * __restrict, ...)
throw ();
extern "C" int
(vfscanf)(FILE * __restrict, const char * __restrict, __gnuc_va_list);
extern "C" int (vscanf)(const char * __restrict, __gnuc_va_list);
extern "C" int
(vsnprintf)(char * __restrict, std::size_t, const char * __restrict,
__gnuc_va_list) throw ();
extern "C" int
(vsscanf)(const char * __restrict, const char * __restrict, __gnuc_va_list)
throw ();
#endif
#if !_GLIBCXX_USE_C99_DYNAMIC
using ::snprintf;
using ::vfscanf;
using ::vscanf;
using ::vsnprintf;
using ::vsscanf;
#endif
_GLIBCXX_END_NAMESPACE
_GLIBCXX_BEGIN_NAMESPACE(std)
using ::__gnu_cxx::snprintf;
using ::__gnu_cxx::vfscanf;
using ::__gnu_cxx::vscanf;
using ::__gnu_cxx::vsnprintf;
using ::__gnu_cxx::vsscanf;
_GLIBCXX_END_NAMESPACE
#endif // _GLIBCXX_USE_C99
#endif
c程序中怎么向文本文件中删除某个字符
没有删除字符的函数,一般方法就是通过写覆盖的方式,或者干脆重新写一个文件,再把文件重命名。
写覆盖的方式,需要用fseek函数来修改当前文件句柄的指针所指的位置,在进行写操作就可以将内容覆盖,达到删除的效果。
FILE *fp;
fp = fopen("a.txt", "r+");
fseek(fp, SEEK_SET, 3); //从文件开头,偏移3个字节
fputc(’a’, fp); //将第三个字节替换为’a’
c语言如何将文件中的两列数据分别存储到两个文件中
分别打开两个文件,分别储存即可。
1、C语言标准库提供了一系列文件操作函数。文件操作函数一般以f+单词的形式来命名(f是file的简写),其声明位于stdio.h头文件当中。例如:fopen、fclose函数用于文件打开与关闭;fscanf、fgets函数用于文件读取;fprintf、fputs函数用于文件写入;ftell、fseek函数用于文件操作位置的获取与设置。一般的C语言教程都有文件操作一章,可以找本教材进一步学习。
2、例程:
#include《stdio.h》
int a;
char b,c;
int main(){
FILE * fp1 = fopen("input.txt", "r");//打开输入文件
FILE * fp2 = fopen("output.txt", "w");//打开输出文件
if (fp1==NULL || fp2==NULL) {//若打开文件失败则退出
puts("不能打开文件!");
return 0;
}
fscanf(fp1,"%d",&a);//从输入文件读取一个整数
b=fgetc(fp1);//从输入文件读取一个字符
fgets(c,100,fp1);//从输入文件读取一行字符串
printf("%ld",ftell(fp1));//输出fp1指针当前位置相对于文件首的偏移字节数
fputs(c,fp2);//向输出文件写入一行字符串
fputc(b,fp2);//向输出文件写入一个字符
fprintf(fp2,"%d",a);//向输出文件写入一个整数
fclose(fp1);//关闭输入文件
fclose(fp2);//关闭输出文件,相当于保存
return 0;
}

更多文章:
nation和national的区别(为什么nation和national两者的a发音不一样)
2026年10月22日 16:40
达梦 insert into select(oracle中insert语句怎么嵌入select)
2026年10月22日 15:20
struts作用(请简单谈一下spring,struts,hibernate的作用;)
2026年10月22日 05:20
low power是什么意思(MP3打开以后提示Low power!是什么意思啊)
2026年10月22日 03:50
律师资格证报考条件非法律专业(不是法学专业的可以考律师证吗)
2026年10月22日 02:40





