文件

  • 流类体系
    • 流:数据从一个对象到另一个对象的传输。
    • 功能:标准输入输出+文件处理
分类含义
文本流一串ASCII字符
二进制流一串二进制

* ios是抽象类
* ostreamcoutclogcerr的类
* istreamcin的类

全局流对象名称缓存
cout标准输出流带缓存
cin标准输入流带缓存
clog标准日志流带缓存
cerr标准错误流无缓存
  • 输出流默认设置
类型进制宽度对齐填充精度
整数十进制0右对齐空格1
实数十进制0右对齐空格6位数
字符串-0右对齐空格字符串实际长度

* 格式控制
* 格式控制成员函数

流对象.格式控制函数(实参)
  • 预定义格式控制函数
预定义格式控制函数(实参)
  • 流的输出控制格式
作用格式控制成员函数预定义格式控制函数预定义格式控制符/操作子
进制flags() setf() unsetf()setiosflags()dec oct hex showbase
宽度width(n)setw(n)-
对齐flags() setf() unsetf()setiosflags()right left internal
填充fill(c)setfill(c)-
精度precision(n)setprecision(n)-

* 流的输出控制格式:dec oct hex
* 数据输入成员函数
字符输入成员函数:get()
字符串输入成员函数:getline()
* 数据输出成员函数:put()


对齐方式

flagmanipulator作用
ios::leftleft居左
ios::rightright居右
ios::internalinternal输出符号或进制后填充
#include <iostream>
using namespace std;

int main(){
    int n = -11;
    cout.width(6);
    cout.flags(ios::right);
    cout << n << endl;

    cout.width(6);
    cout.flags(ios::left);
    cout << n << endl;

    cout.width(6);
    cout.flags(ios::internal);
    cout << n << endl;
}
#include <iostream>
#include <iomanip>
using namespace std;

int main(){
    int n = -11;
    cout << setw(6) << right << n << endl;
    cout << setw(6) << left << n << endl;
    cout << setw(6) << internal << n << endl;
}
#include <iostream>
using namespace std;
int main(){
int n = -11;
    cout.width(6); cout << left << n << endl;
    cout.width(6); cout << right << n << endl;
    cout.width(6); cout << internal << n << endl;
}

整数输出格式

flagmanipulator作用是否默认
ios::decdec十进制
ios::octoct八进制
ios::hexhex十六进制
ios::uppercaseuppercase使用大写输出十六进制
ios::showbaseshowbase输出带有进制的字符
#include <iostream>
using namespace std;
int main(){
    int n = 11;
    cout.flags(ios::dec);
    cout << n << endl;
    cout.flags(ios::hex);
    cout << n << endl;
    cout.flags(ios::oct);
    cout << n << endl;

    cout.flags(ios::showbase|ios::dec);
    cout << n << endl;
    cout.flags(ios::showbase|ios::oct);
    cout << n << endl;
    cout.flags(ios::showbase|ios::hex);
    cout << n << endl;

    cout.flags(ios::showbase|ios::uppercase|ios::dec);
    cout << n << endl;
    cout.flags(ios::showbase|ios::uppercase|ios::oct);
    cout << n << endl;
    cout.flags(ios::showbase|ios::uppercase|ios::hex);
    cout << n << endl;
}
#include <iostream>
using namespace std;
int main(){
    int n = 11;
    cout << dec << n << endl;
    cout << hex << n << endl;
    cout << oct << n << endl;

    cout << showbase << dec << n << endl;
    cout << oct << n << endl;
    cout << hex << n << endl;

    cout << uppercase << dec << n << endl;
    cout << oct << n << endl;
    cout << hex << n << endl;
}

浮点数八进制/十六进制输出结果?

flag作用是否默认
ios::showpoint输出浮点数时,必须带小数点

浮点数输出格式

flag作用是否默认
ios::scientific科学计数法输出浮点数
ios::fixed定点数方式输出实数

定点数方式比浮点数方式更精确
取浮点数精确度时,设置ios::fixed

#include <iostream>     // cout, std::fixed, std::scientific
using namespace std;

int main () {
  double a = 3.1415926534;
  double b = 2006.0;
  double c = 1.0e-10;

  cout.precision(5);
  cout << "default:\n";
  cout << a << endl << b << endl << c << endl;

  cout << "fixed:\n";
  cout.flags(ios::fixed);
  cout << a << endl << b << endl << c << endl;

  cout << "scientific:\n";
  cout.flags(ios::scientific);
  cout << a << endl << b << endl << c << endl;

  return 0;
}
#include <iostream>     // std::cout, std::fixed, std::scientific
#include <iomanip>
using namespace std;

int main () {
  double a = 3.1415926534;
  double b = 2006.0;
  double c = 1.0e-10;

  cout << setprecision(5)
       << "default:\n"
       << a << endl << b << endl << c << endl;

  cout << "fixed:\n" << fixed
       << a << endl << b << endl << c << endl;

  cout << "scientific:\n" << scientific
       << a << endl << b << endl << c << endl;

  return 0;
}
#include <iostream>     // std::cout, std::fixed, std::scientific

int main () {
  double a = 3.1415926534;
  double b = 2006.0;
  double c = 1.0e-10;

  std::cout.precision(5);
  std::cout << "default:\n";
  std::cout << a << '\n' << b << '\n' << c << '\n\n'

  std::cout << "fixed:\n" << std::fixed;
  std::cout << a << '\n' << b << '\n' << c << '\n\n'

  std::cout << "scientific:\n" << std::scientific;
  std::cout << a << '\n' << b << '\n' << c << '\n\n';

  return 0;
}

布尔类型输出格式

flagmanipulator作用
ios::boolalphaboolalphabool值以字符串true/false输出
flagmanipulator作用
ios::showposshowpos输出十进制0或者正数时,带+号
#include <iostream>     // std::cout, std::showpos, std::noshowpos
using namespace std;
int main () {
  int p = 1;
  int z = 0;
  int n = -1;
  cout << showpos   << p << '\t' << z << '\t' << n << endl;
  cout << noshowpos << p << '\t' << z << '\t' << n << endl;
  return 0;
}
#include <iostream>     // std::cout, std::showpos, std::noshowpos
using namespace std;
int main () {
  int p = 1;
  int z = 0;
  int n = -1;
  cout.setf(ios::showpos); cout << p << '\t' << z << '\t' << n << endl;
  cout.unsetf(ios::showpos); cout << p << '\t' << z << '\t' << n << endl;
  return 0;
}

字符串转化数字

istringstream iss(str);
int n;
iss >> n;

C++11提供如下函数简化字符串转数字
* stoi() stol() stoul() stoll() stoull()
* stof() stod() stold()

数字转化字符串

int n;
ostringstream oss;
oss << n;
oss.str();

string字符串遍历

string str("abcdefg");
  1. C写法
for(size_t i=0;i<str.size();i++){
  cout << str[i] << endl;
}
  1. 迭代器写法
for(string::iterator it = str.begin();it != str.end();it++){
  cout << *it << endl;
}
  1. STL for_each写法
void print(char c){
  cout << c << endl;
}
for_each(str.begin(),str.end(),print);
  1. C++11迭代器写法
for(string::iterator it = begin(str);it != end(str);it++){
    cout << *it << endl;
}

或者

for(auto it = begin(str);it != end(str);it++){
    cout << *it << endl;
}
  1. C++11 for新语法写法
for(char c : str){
    cout << c << endl;
}

或者

for(auto c : str){
    cout << c << endl;
}
  1. C++11 STL for_each与lamdba表达式
for_each(begin(str),end(str),[](char c){cout << c << endl;});

向量遍历

vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
  1. C写法
for(size_t i=0;i<vec.size();i++){
  cout << vec[i] << endl;
}
  1. 迭代器写法
for(vector<int>::iterator it = vec.begin();it != vec.end();it++){
  cout << *it << endl;
}
  1. STL for_each写法
void print(int n){
  cout << n << endl;
}
for_each(vec.begin(),vec.end(),print);
  1. C++11迭代器写法
for(vector<int>::iterator it = begin(vec);it != end(vec);it++){
    cout << *it << endl;
}

或者

for(auto it = begin(vec);it != end(vec);it++){
    cout << *it << endl;
}
  1. C++11 for新语法写法
for(int n : vec){
    cout << n << endl;
}

或者

for(auto n : vec){
    cout << n << endl;
}
  1. C++11 STL for_each与lamdba表达式
for_each(begin(vec),end(vec),[](int n){cout << n << endl;});
  • C++文件读写
    文件:文件名+文件内容(有序数据集合)
    文件名:字符序列
    文件数据格式:二进制文件/文本文件

  • C++文件操作流程

    1. 打开文件
    2. 读写文件
    3. 关闭文件
  • 打开/关闭文件

操作代码
定义读文件流对象ifstream 读文件流对象
定义写文件流对象ofstream 写读文件流对象
定义读写文件流对象fstream 读写读文件流对象
成员函数打开文件文件流对象.open(文件名,文件打开方式)
构造函数打开文件文件流类 对象(文件名,文件打开方式)
判断文件是否打开!文件流对象
关闭文件文件流对象.close(变量)

* 文本文件读写

操作代码
提取运算符读文件文件流对象 >> 变量
插入运算符写文件文件流对象 << 变量
成员函数读文件文件流对象.get(变量)
成员函数写文件文件流对象.put(变量)

* 二进制文件读写

操作代码
读函数read()
写函数write()
测试文件结束eof()

* 文件打开方式

类型代码
ios::in
ios::out
添加末尾ios::app
已存在文件ios::nocreate
未打开文件ios::noreplace
二进制ios::binary

* 文件对象指针位置函数

操作代码
获取读位置对象.tellg()
获取写位置对象.tellp()
设置读位置对象.seekg()
设置写位置对象.seekp()

如果文件是以ios::app文本追加方式打开,指针位置默认在文件结束,其他情况默认在文件开头。

  • 文件对象状态函数
操作代码
判断文件对象状态是否正常对象.good()
重置文件对象状态对象.clear()

流式文件类型
1. stream流文件
2. 文件指针FILE*

stream流文件读写

  • ifstream文件读
ifstream fin(文件路径);
fin >> 变量
fin.close();
  • ofstream文件写
ofstream fout(文件路径);
fout << 变量
fout.close();
  • fstream文件写
fstream fs(文件路径);
if(!fs){
  fs << 变量;
  fs.tellp(ios::beg);
  fs >> 变量;
  fs.close();
}

文件指针FILE读写

  • FILE文件指针读
FILE* fp = fopen(文件路径,"r");
fscanf(,fp);
fclose(fp);
  • FILE文件指针写
FILE* fp = fopen(文件路径,"w");
fprintf(,fp);
fclose(fp); 

对象的序列化与反序列化
序列化:把对象转化成文本/二进制
反序列化:把文本/二进制转化成对象

文件重定向

freopen(文件路径,操作,标准IO)

操作:读(w) 写(r)

  • 重定向写
freopen("out.txt","w",stdout);
cout << "out data" <<endl;
  • 重定向读
freopen("in.txt","r",stdin);
string str;
cin >> str;

几种常见的文件读取方式对比
* ifstream + fin
* freopen+cin+sync_with_stdio(false)
* FILE* + fscanf
* freopen+scanf
* freopen+cin

实现日志模块

日志:记录程序日常运行状态。按条记录,记录内容包括:时间、模块、日志级别(致命、出错、警告、信息、调试)、输出位置(文件、终端、系统日志)

日志信息格式

yyyy-mm-dd hh-MM-ss [Level] module file:line func:message

日志文件名格式
yyyy-mm-dd-XXXX.log
yyyy-mm-dd-XXXX2.log

配置文件格式
文件名:log.conf
内容:
level=ERROR,INFO或者ALL
path=XXXX/xxxx
module=ALL或者XXXX
backlog=date/file
backlog-size=10d/100M
max-size=1G

接口

FATAL(module,str);
ERROR(module,str);
WARNING(module,str);
INFO(module,str);
DEBUG(module,str);

性能
1. 控制日志输出位置
2. 控制日志输出级别
3. 控制日志输出模块
4. 是否支持多线程
5. 日志备份(按日期、按大小),设置备份数量
6. 设置最大日志文件大小

特殊功能
终端输出不同级别颜色不同
危险红
警告黄
信息蓝
默认黑

freopen("test.log","w",stderr);
cerr << "FATAL";
cerr << "ERROR";
clog << "WARNING";
clog << "INFO";
clog << "DEBUG";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值