IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++拷贝/复制一张图片 -> 正文阅读

[C++知识库]C++拷贝/复制一张图片

最近发现了自己网站一个bug(早发现了,一直没去深入探索原因),我网站的图标没了,按F12看看图标传过来了吗,发现传过来了。但为啥没显示出来百思不得其解,起初是怀疑图片是二进制文件保存的,所以按正常文件读写是不对的,想了之后决定用sendfile函数(Linux的一个系统函数,也叫零拷贝函数,没用过的同学可以翻翻man手册或者搜搜了解一下)发送二进制文件,对jpg、png来一个判断,然后sendfile直接发送,这样做起来改动是最少的,该完之后确实发现ok了,就放在那里没改了,最近要修改一下网站后台的源码,决定重新挖掘一下原因,记录一下这个bug。

如果读二进制文件,C语言的fopen,打开方式需要指定一个b,表示binary以二进制的文件打开。C++需要ios::binary来打开(在unix类系统中,ios::binary写不写貌似都可以,我查资料显示的是针对windows平台对换行符做了特殊的处理)
在这里插入图片描述

这是一份处理正确的代码,seekg移动到末尾,来看一下文件的大小,然后在移到起始位置来读文件。在进行写入文件

int succeful(){
	ifstream is("1.jpeg", ifstream::in | ios::binary);

	is.seekg(0, is.end);
	int length = is.tellg();
	is.seekg(0, is.beg);

	char * buffer = new char[length];

	is.read(buffer, length);


    ofstream os("111.jpeg",ofstream::out | ios::binary);

	if(!os.is_open()){
        cout << "写入文件未打开" << endl;
        return -1;
    }
    os.write(buffer,length);
    delete [] buffer;
	is.close();
	os.close();
}

上述代码是正确的,我们写C++都知道cout也是一个流对象,我可以cout << “XXXXXX”,上面写入文件os也是可以 os << buffer的,天真的我这么做了发现了又出bug了,拷贝文件失败了。为什么会失败捏?因为char*遇到’\0’是会自动停止输出的,而write指定输出长度所以就算遇到了‘\0’也不会停下来的

又解决了一个难题,你以为结束了吗?不并没有,我的网站用的是string类型读文件,而不是char*,当我把buffer赋值给string对象,天真的我以为一切正常,凌晨三点的我准备关机睡觉,结果一运行发现竟然是错的
改动如下:

string s = buffer;
	if(!os.is_open()){
        cout << "写入文件未打开" << endl;
        return -1;
    }
    // os.write(s.c_str(),length);
    // os.write(s.c_str(),s.size());
	os << s;

write也不对,size也不对、length也不对、os直接输出也不对,当时我内心为啥阿咋回事,我起初以为c_str()用的不对,后来忘了看那篇文章了,提了一句stirng构造函数,我就明白了,因为在构造string对象的时候char*遇到\0就结束了,所以string数据是不正确的,string s(buffer,length);改成这样子就OK了。string的小坑,之前确实没注意string的构造函数,也没注意到’\0’引发的问题

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 16:38:20  更:2021-10-01 16:39:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:28:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码