这里主要讲述如何在C++编程中读取图片文件,主要介绍两种方式:一种的是C++风格,主要是采用文件流的方式,另一种是C风格,主要采用FILE类的相关操作。小面分别对两种方式进行介绍。
主要的步骤:
对应的头文件:
#include
主要用到的函数:
seekg:设置输入文件流的文件流指针位置
seekg()定义:
istream& seekg (streampos pos);//将读指针设置到pos位置
istream& seekg (streamoff off, ios_base::seekdir way);//将读指针设置为way+off
其中off代表偏移值可以是正负数值,正的表示向后偏移,负的表示向前偏移。而way代表基址,可以是:
ios::beg:表示输入流的开始位置
ios::cur:表示输入流的当前位置
ios::end:表示输入流的结束位置
tellg: 用于获取文件流中的文件流指针的位置
//tellg()定义:
streampos tellg();//返回一个整型数,代表读指针的位置
//example:streampos pos = tellg();//将tellg()返回的指针位置赋值给pos
函数原型: read(unsigned char *buf,int num);
read()从文件流中读取num个字符到buf指向的缓存中,如果在还未读入 num个字符时就到了文件尾,可以用成员函数gcount()来取得实际读取的字符数。
代码:
#include // ifstream, ifstream::in
using namespace std;
int main(){
// 1. 打开图片文件
ifstream is("test.jpg", ifstream::in | ios::binary);
// 2. 计算图片长度
is.seekg(0, is.end); //将文件流指针定位到流的末尾
int length = is.tellg();
is.seekg(0, is.beg); //将文件流指针重新定位到流的开始
// 3. 创建内存缓存区
char * buffer = new char[length];
// 4. 读取图片
is.read(buffer, length);
// 到此,图片已经成功的被读取到内存(buffer)中
delete [] buffer;
return 0;
}
上述程序中出现了ios::binary,关于文件流ios::binary的作用如下:
在创建文件流时,可以显示指定它的打开方式为ios::binary,也就是以二进制方式打开。但是,无论是否指定二进制方式打开文件,读写的最小单位都是字节。那么,它到底起到什么作用呢?
首先,介绍一下二进制方式打开与普通打开方式的区别,两者大的区别在于对换行符的处理方式不同。由于历史原因,Windows操作系统是用两个字符(\r\n)来表示换行符的;而Unix操作系统却是用单个字符(\n)来表示换行符的。因此,在创建文件流时,如果指定了以ios::binary方式打开,那么换行符就是单字符的;否则,就采用Windows操作系统的双字符。
总结来说,以ios::binary方式打开,换行符被解释成\n;反之,换行符被解释成\r\n。
所以为了兼容性,通常在Windous系统中通常使用ios::binary方式打开图像文件;在Unix(或类Unix)操作系统中,指定和不指定ios::binary方式没有区别。
详细的文件流操作参考链接:https://www.cnblogs.com/hjj-fighting/p/10429178.html
1、文件类型指针
typedef struct {
int level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
int bsize; /* Buffer size */
unsigned char _FAR *buffer; /* Data transfer buffer */
unsigned char _FAR *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE; /* This is the FILE object */
FILE *fp;
2、文件操作常用函数
fopen()函数
文件打开模式:
"r":只能从文件中读数据,该文件必须先存在,否则打开失败。
"w":只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件。
"a":向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾。
"r+":可读/写数据,该文件必须先存在,否则打开失败。 "w+":可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据。 "a+":可读/写数据,原来的文件不被删去,位置指针移到文件末尾。
打开二进制文件的模式与打开文本文件的含义是一样的,不同的是模式名称里面多一个字母'b’,以表示以二进制形式打开文件。
fclose()函数
函数原型为:int fclose(FILE *);
关闭成功返回值0,否则返回非零值。
在执行完文件的操作后,要进行“关闭文件”操作。虽然程序在结束前会自动关闭所有的打开文件,但文件打开过多会导致系统运行缓慢,这时就要自行手动关闭不再使用的文件,来提高系统整体的执行效率。
文件的读写操作
fread()函数和fwrite()函数是按数据块的长度来处理输入/输出的,在用文本编辑器打开文本文件时可能因发生字符转换而出现莫名其妙的结果,所以这两个函数通常用于二进制文件的输入/输出。
与gets()不同的是,fgets()从指定的流读取字符串,读到换行符时将换行符也作为字符串的一部分读到字符串中来。
与puts()不同的是,fputs()不会在写入文件的字符串末尾加上换行符'\n'。
文件的定位
fseek() 一般用于二进制文件,在文本文件中由于要进行转换,计算的位置有时会出错。
代码
#include
using namespace std;
int main(){
FILE *in;
// 1. 打开图片文件
int = fopen(path, "rb")
ifstream is("test.jpg", ifstream::in | ios::binary);
// 2. 计算图片长度
fseek(in, 0L, SEEK_END);
int len = ftell(in);
fseek(in, 0L, SEEK_SET);
// 3. 创建内存缓存区
char * buffer = new char[length];
// 4. 读取图片
fread(buffer, sizeof(char), len, in);
fclose(in);
// 到此,图片已经成功的被读取到内存(buffer)中
delete [] buffer;
return 0;
}
https://www.cnblogs.com/lanhaicode/p/10320097.html
https://blog.csdn.net/qq_29695701/article/details/84262492