C++常用功能汇总-文件读写 计时 随机数

  • 1、字符串string类
  • 2、文件读写
    • (1)文本文件读取与写入
    • (2)文件夹相关操作
  • 3、计时函数
    • time()
    • clock()
    • timeGetTime()
  • 4、随机数
    • (1)cstdlib中伪随机数
    • (2)C++11中的random类

1、字符串string类

  • 参考链接:C+±string字符串类(详解)
    #include <string>
  • 常用构造函数:
string str;        //生成一个空字符串
string str ("ABC")  //等价于 str="ABC"<br>
string str ("ABC", strlen)  // 将"ABC"存到str里,最多存储前strlen个字节
string s("ABC",stridx,strlen)   //将"ABC"的stridx位置,做为字符串开头,存到str里.且最多存储strlen个字节.
string s(strlen, 'A')  //存储strlen个'A'到str里
  • 常用成员函数:
str1.assign("ABC");        //清空string串,然后设置string串为"ABC"
str1.length();                 //获取字符串长度
str1.size();            //获取字符串数量,等价于length()
str1.capacity();          //获取容量,容量包含了当前string里不必增加内存就能使用的字符数
str1.resize(10);           //表示设置当前string里的串大小,若设置大小大于当前串长度,则用字符\0来填充多余的.
str1.resize(10,char c);     //设置串大小,若设置大小大于当前串长度,则用字符c来填充多余的
str1.reserve(10);         //设置string里的串容量,不会填充数据.
str1.swap(str2);              //替换str1 和 str2 的字符串
str1.puch_back ('A');      //在str1末尾添加一个'A'字符,参数必须是字符形式
str1.append ("ABC");       //在str1末尾添加一个"ABC"字符串,参数必须是字符串形式
str1.insert (2,"ABC");       //在str1的下标为2的位置,插入"ABC"
str1.erase(2);             //删除下标为2的位置,比如: "ABCD" --> "AB"
str1.erase(2,1);              //从下标为2的位置删除1个,比如: "ABCD"  --> "ABD"
str1.clear();              //删除所有
str1.replace(2,4, "ABCD"); //从下标为2的位置,替换4个字节,为"ABCD"
str1.empty();            //判断为空, 为空返回true
  • 与char*相互转换:
str.c_str();        //string转为char*char *st = "hello";
string st1 = st;
string st2(st, st + strlen(st));
  • 与数字的转换:
    #include <sstream>>
//-----------string转为数字:
istringstream iss ("123.5");    //定义对象iss,初始化为"123.5" ,
//等价于:
//istringstream iss;
//iss.str("123.5");                 //设置对象iss为"123.5" ,
double num;if(iss>>num)                 //通过调用iss.operator >>(num), 将"123.5"转为数字,并返回bool类型变量cout<<num << endl;
//也可以通过临时对象转换:
string str="123.5";
double num;
if(istringstream(str)>>num)        //通过临时对象,来将str转为数字cout<<num<<endl;
//或者将第3行,写为宏:
#define TO_NUM(str,num)     (istringstream(str)>>num)//-----------数字转为string
ostringstream oss;
oss <<123.5;                   //相当于调用: oss.str("123.5");
string str= oss.str() ;
//也可以通过宏,这样写:
#define TO_STRING(num)     ( ((ostringstream&)(ostringstream()<<num)).str() )
double num=123.5;
string str= TO_STRING(123.5);

2、文件读写

  • 参考链接:
    Windows下对文件夹下所有图片批量重命名
    C++读取文件夹中所有文件的路径,包含子文件夹

(1)文本文件读取与写入

#include <fstream>
int count;
fstream inFile, outFile;
if( (_access( "in.txt", 0 )) != -1 )
{  printf_s( "File crt_ACCESS.C exists.\n" );inFile.open("in.txt", ios::in | ios::binary);//二进制读取
}
outFile.open("out.txt", ios::out | ios::binary);//二进制写入
inFile >> count;
outFile << count;
inFile.close();
outFile.close();

(2)文件夹相关操作

  • 判断文件夹是否存在
#include <io.h>  //Win
#include <unistd.h><pre name="code" class="cpp">int access(const char* _Filename, int _AccessMode)
_AccessMode:{#define R_OK 4 /* Test for read permission. 读权限*/#define W_OK 2 /* Test for write permission. 写权限*/#define X_OK 1 /* Test for execute permission. 是否可执行*/#define F_OK 0 /* Test for existence. 是否存在*/
}
  • 创建、删除文件夹
#include <direct.h>
int mkdir(const char *_Path)
int rmdir(const char *_Path)

函数返回0表示成功,返回-1表示失败或不存在

3、计时函数

  • 参考链接:【C/C++】计时函数比较

time()

time()获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。

void test1()
{time_t start,stop;start = time(NULL);foo();//dosomethingstop = time(NULL);printf("Use Time:%ld\n",(stop-start));
}

clock()

clock()函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)
常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元。

void test2()
{double dur;clock_t start,end;start = clock();foo();//dosomethingend = clock();dur = (double)(end - start);printf("Use Time:%f\n",(dur/CLOCKS_PER_SEC));
}

timeGetTime()

timeGetTime()函数以毫秒计的系统时间。该时间为从系统开启算起所经过的时间,是windows api。

void test3()
{DWORD t1,t2;t1 = timeGetTime();foo();//dosomethingt2 = timeGetTime();printf("Use Time:%f\n",(t2-t1)*1.0/1000);
}

4、随机数

  • 参考链接:C++随机数类random的使用

(1)cstdlib中伪随机数

C语言中通过函数rand和srand来产生伪随机数,这两个函数包含在头文件cstdlib中,其中srand用来产生设置随机数种子,rand每次返回一个当前的种子对应的随机数,这两个函数的声明如下:

void srand(unsigned seed);
int rand(void);

这两个函数的原型形如:

unsigned long int next = 1;
/* rand: return pseudo-random integer on 0..32767 */
int rand(void)
{next = next * 1103515245 + 12345;return (unsigned int)(next/65536) % 32768;
}
/* srand: set seed for rand() */
void srand(unsigned int seed)
{next = seed;
}

显然rand只能生成整数,需要小数时,只需要跟一个浮点数进行除法即可
一个生成[1, 15]的随机数例子:

#include <iostream>
#include <cstdlib>
#include <ctime>//random num range is min to max, template function
template <typename T> T cRandom(int min, int max)
{return (min + static_cast<T>(max * rand() / static_cast<T>(RAND_MAX + 1)));
}int main(void)
{srand((unsigned)time(NULL));//生成10个整数std::cout << "int: " << std::endl;for (int i = 0; i < 10; ++i) {std::cout << cRandom<int>(1, 15) << " ";}std::cout << std::endl;//生成10个小数std::cout << "double: " << std::endl;for (int i = 0; i < 10; ++i) {std::cout << cRandom<double>(1, 15) << " ";}std::cout << std::endl;return 0;
}

生成指定范围的随机数表达式:

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
  • 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
  • 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;

通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。

  • 要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
  • 要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。

(2)C++11中的random类

random类是C++11中增加的类,该类可以用于生成随机数,具有C语言中rand生成伪随机数的功能,但其功能更强大。原生支持生成浮点数,及分布类。

随机数发生器主要由分布对象和随机数引擎对象组成。其中随机数引擎用于根据随机数种子来产生随机数,分布对象对产生的随机数根据需求进行分布。
random中定义了多种随机数引擎及分布类型,常用的引擎是默认伪随机数引擎类default_random_engine,常用的分布类有产生整型分布的uniform_int_distribution,产生浮点型的分布uniform_real_distribution。

举例

该程序输出15个double类型的随机数

#include <random>
#include <iostream>
#include <ctime>//该函数接受三个参数分别指定随机数范围和种子,返回double
double random_unint(unsigned int min, unsigned int max, unsigned int seed = 0)
{static std::default_random_engine e(seed);static std::uniform_real_distribution<double> u(min, max);return u(e);
}int main(void)
{for (int i = 0; i < 15; ++i) {std::cout << random_unint(0, 15, time(NULL)) << " ";}std::cout << std::endl;return 0;
}

需要注意

  1. 一个给定的随机数发生器一直会生成相同的随机数序列。一个函数如果定义了局部的随机数发生器,应该将其(包括引擎和分布对象)定义为static的,否则每次调用函数都会生成相同的序列。也就是说定义成static后每次调用还是之前那个发生器,第一次调用产生一批随机数,再次调用将产生接下来的随机数,否则每次调用产生的都是最前面的那些随机数。
  2. 依然需要使用time来做为种子产生每个不同时刻都不同的随机序列,但由于time默认返回的是以秒计的时间,所以有可能多次使用的都是相同的种子。

伪随机数引擎

  1. 随机数引擎支持的操作如下:
Engine e; //默认构造函数,使用该引擎类型的默认种子
Engine e(s); //使用整型s做为种子
e.seed(s); //使用整型s重置引擎状态
e.min(); //返回此引擎所能生成的最小和最大值
e.max();
Engine::result_type //此引擎生成的类型(unsigned)
e.discard(u); //将引擎推进u步,u为unsigned long long类型
  1. 随机数引擎使用
std::default_random_engine e;   //生成随机的无符号数
std::cout << e();       //通过()调用对象生成下一个随机数并输出

分布

  1. 分布类型有很多种,常用的有返回整型的uniform_int_distribution和返回浮点型的uniform_real_distribution
  2. 分布支持的操作
Dist d; //默认构造函数
Dist d(min, max); //为d指定范围
d(e) //e是一个随机数引擎对象
d.min() //返回d(e)所能生成的最小值和最大值
d.max()
d.reset(); //重置d的状态,使得随后对d的使用不依赖于d已经生成的值

C++常用功能汇总-文件读写 计时 随机数相关推荐

  1. 《Python数据分析基础教程:NumPy学习指南(第2版)》笔记5:第三章 常用函数1——文件读写、算术平均值、最大值最小值、极值

    本章将介绍NumPy的常用函数.具体来说,我们将以分析历史股价为例,介绍怎样从文件中载入数据,以及怎样使用NumPy的基本数学和统计分析函数.这里还将学习读写文件的方法,并尝试函数式编程和NumPy线 ...

  2. JavaScript 曾经熟知的常用功能汇总

    JavaScript 常用字符串处理功能汇总 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协 ...

  3. hbuilder html id,Hbuilder常用功能汇总(示例代码)

    引用 样式表: mui.min.css Js:mui.min.js 常用功能 获取页面 var webView=plus.webview.currentWebview();//获取当前页 var we ...

  4. Capslock+常用功能汇总

    00 下载 Capslock+官方下载地址 01 组合键 1.1 组合键原则 常规:Capslock + ~ 功能加强:Capslock + Alt + ~详见官方手册[1] 1.2 快速启动 Ctr ...

  5. matplotlib——1. 常用功能汇总

    文章目录 1.IDE里的 1.1 显示模式(plt.ion()和plt.ioff()) 1.2 backend说明 2. jupyter里的(主要是和iwidgets组件结合交互式) 3 通用的 3. ...

  6. 3 文件读写 计时 我的烂电脑在1S钟能写70多MB的数据

    #include <stdio.h> #include <time.h> int main () {  FILE * pFile;  int i;  pFile = fopen ...

  7. python编辑器使用技巧大全_markdown编辑器常用功能汇总

    Markdown是一种纯文本格式的标记语言.通过使用简单的语法,可以给普通文本增加样式,使其排版更加美观. 下面总结了一些常用的markdown语法,方便查阅和使用. 1. 标题 通过在文字前面增加 ...

  8. 图像增强工具Augmentor常用功能汇总

    目录 安装: 使用: 用法一(图片旋转) 1.90度旋转 用法二(透视形变) 1.垂直形变 2.斜四角形变 用法三(弹性扭曲) 用法四(错切变换) 用法五:随机擦除 用法六:区域裁剪 1.从中心裁剪 ...

  9. Python-datetime、time包常用功能汇总

    目录 基础知识 时间格式有哪些? Python中的时间格式化 时间戳 datetime date datetime timedelta time 常用 获取今天凌晨字符串? 将一个时间格式的字符串转为 ...

最新文章

  1. OpenGL函数功能glutTimerFunc()
  2. 夏普电视android4.4.2,夏普电视怎么投屏 夏普电视投屏设置方法【详解】
  3. 四种可变交流swap方法
  4. 浅谈飞鸽传书实现原理
  5. Java如何读取mysql存入es_java循环读取mysql并存入java集合里
  6. CaseStudy-数据缓存出错
  7. Android开发笔记(十五)淡入淡出动画TransitionDrawable
  8. 区块链安全的奥秘之一:非对称加密
  9. Dynamics Ax 2012中调用外部web服务
  10. JDK11下载和安装(windows)
  11. 超详细excel键盘快捷键大全
  12. MacOS下好用的截图软件snip
  13. 一键AI着色,黑白老照片画面瞬间鲜活
  14. C++实用的闹钟程序
  15. 考研数学第三章复习:曲率、曲率圆、曲率半径
  16. Linux进程中有xorg,Linux黑话解释:Xorg,X11,Wayland,什么是显示服务器
  17. (二)海思3519av100开发:开发板环境搭建
  18. 2006年9月15日
  19. 【Restful接口】restful接口的两种使用方式
  20. Windows注册服务的几种方式

热门文章

  1. CSS浮动/常见网页布局/清除浮动/学成在线案例
  2. 【C语言关键知识点1】C语言的预处理、编译和链接过程
  3. ubuntu写yacc
  4. 树莓派配置USB声卡
  5. ATW热泵市场现状及未来发展趋势分析
  6. PT-RS for PUSCH
  7. 【精华】OCR关键信息提取之SER和RE
  8. mysql删库命令是啥_删除数据库的命令是什么
  9. 我是小交易所老板,我现在很慌
  10. JS生成 GUID 或 UUID 四种方法