通常,输入输出的主体是内存,输入是指输入到内存变量(变量存储在内存中),输出是指从内存变量输出。

另外,输入输出通常是指设备文件与内存的交互。设备文件可以是键盘、显示器等标准设备文件,也可以是磁盘文件,甚至另一块内存。

还有,设备文件与内存的交互,通常因为效率的考量,并不是直接的交互,通常以缓存(也是一块内存)为中介。

也可以描述为:

1 printf()与scanf()

double db;

scanf("%lf",&db);

printf("output:%f",db);

fflush(stdin); // 将回车符丢弃掉

char str[50];

scanf("%[^]",str);/*scanf("%s",string);不能接收空格符*/

printf("%s",str);

2 fprintf()与fscanf()

前面的f是指file指针,后面的f是指format。

相对于printf()与scanf(),多出来的参数是一个FILE指针:

int fscanf(FILE * stream, const char * format, [argument...]);int fprintf( FILE *stream, const char *format, [ argument ]...)

也可以使用标准文件指针:

fscanf(stdin,"format",char[]);fprintf(stdout,"format",char[]);

直接等同于

scanf("format",varlist);printf("format",varlist);

实例:

#include #include int main(void){    FILE *out,*fp;    fp = fopen("fp.txt","w+");    if(fp == NULL)        return 1;fprintf(fp, "input file the %dst.",1);fprintf(fp, "input file the %dnd.",2);fflush(fp);fclose(fp);  char str[66];fp = fopen("fp.txt","r");fscanf(fp,"%s",str);fclose(fp);fprintf(stdout,"%s",str); //等同printf("%s",str);    out = fopen("out.txt", "w+");    if(out == NULL)        return 1;    fprintf(out, "%s",str);    //while(!feof(in))        //fputc(fgetc(in), out);    fclose(out);system("type out.txt");system("pause");    return 0;}

3 sscanf()与ssprintf()

前面的s表示一个string指针。

相对于printf()与scanf(),多出来的参数是一个string指针,对应一块内存(其数据流动是:内存→另一块内存),用于字符串格式化或转换:

int sscanf(const char *buffer ,const char *format, [ argument ] ... );

相当于将buffer按format拆解为一个个的argument。

int sprintf(char *string, char *format [,argument,...]);

相当于将一个个的argument按format装配成一个string。

实例:

#include    int main( void )  {     char  tokenstring[] = "15 12 14...";     char  s[81];     char  c;     int   i;     float fp;     sscanf( tokenstring, "%80s", s );     sscanf( tokenstring, "%c", &c );     sscanf( tokenstring, "%d", &i );     sscanf( tokenstring, "%f", &fp ); char str[222];     sprintf(str,"%s%c%d%f",s,c,i,fp);     printf( "%s", str); getchar();  } // 1511515.000000 

4 va_list参数列表的输入输出

以前函数名前面如果再增加一个字符"v",表示va_lsit。

如vscanf、vfscanf()、vsscanf()。

vsscanf()与sscanf()类似,但该函数用一个va_list类型形参列表代替变量参数列表。

#include #include //模拟实现系统提供的printf函数int vpf(char* fmt,...){va_list argptr;int cnt;va_start(argptr,fmt);// 第一个参数为指向可变参数字符指针的变量,                     // 第二个参数是可变参数的第一个参数,通常用于指定可变参数列表中参数的个数cnt=vprintf(fmt,argptr);va_end(argptr);//将存放可变参数字符串的变量清空return(cnt);}int main(){int inumber=30;float fnumber=90.0;char* string="abc";vpf("%d%f%s",inumber,fnumber,string);getchar();return 0;}//3090.000000abc

5 综合比较

printf()、scanf() : 其f表示format,两个参数,隐含stdout或stdin

fprintf()、fscanf() : 前面的f表示File*,也是增加的参数

sscanf()、ssprintf() : 前面的s表示string,一个char*,也是增加的参数

vsscanf()、vssprintf() : 前面的v表示va_list,参数列表使用va_list

数据传输的方向是:

6 IO函数之间的相应关系

-End-

c++ char*转string_CC++|输入输出与内存、缓存、设备文件相关推荐

  1. C#开源磁盘/内存缓存引擎

    前言 昨天写了个 <基于STSdb和fastJson的磁盘/内存缓存>,大家可以先看看.下午用到业务系统时候,觉得可以改进一下,昨晚想了一个晚上,刚才重新实现一下. 更新 1. 增加了对批 ...

  2. Android 图片缓存之内存缓存技术LruCache,软引用

    Android 图片缓存之内存缓存技术LruCache,软引用

  3. 图片缓存之内存缓存技术LruCache,软引用

    图片缓存之内存缓存技术LruCache,软引用 每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个 问题曾经让我觉得很烦恼 ,后来终于得到了解决, 那么现在就让我和大家一起分享 ...

  4. mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置

    mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置 转载自勤奋的小青蛙 mongodb占用内存非常高,这是因为官方为了提升存储的效率,设计就这么设计的. 但是大部分的个人 ...

  5. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )

    文章目录 一.Bitmap 复用池 二.弱引用 Bitmap 内存释放 三.从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象 1.Android 2.3.3(API 级别 10)及以 ...

  6. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )

    文章目录 一.Bitmap 内存缓存策略 二.LruCache 内存缓存 三.LruCache 常用操作 四.LruCache 工具类 五.源码及资源下载 官方参考 : Google 官方提供的 内存 ...

  7. java cache详解,Java内存缓存详解

    1.缓存为什么要存在 应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的.如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计 算量,缩短请求流程(减少网络io或者硬盘io),这时候 ...

  8. Java内存缓存-通过Google Guava创建缓存

    谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中.实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问. Guava ...

  9. 简单聊聊Glide的内存缓存

    前言 glide的内存缓存有两级:LruCache.ActiveResources 其中LruCache老生常谈了,这里就不细说了. ActiveResources实际上内含一个HashMap,Map ...

最新文章

  1. MySQL索引背后的数据结构及算法原理【转】
  2. 苹果 开发者账号区别
  3. mondrain多维分析引擎+saiku web展现层的演示环境搭建
  4. 希尔伯特曲线 java_Java中空间填充Hilbert曲线的递推算法
  5. java fx border_JavaFx UI控件与代码间的绑定方法
  6. python父亲节礼物_父亲节程序员硬核示爱:你能看懂几条
  7. Ubuntu中anaconda的安装及使用
  8. python逐行读取txt文件readline_Python - 无法读取整个.txt文件:.readlines错误?
  9. python wechatpay微信支付回调_python服务器 实现app微信支付:支付异步通知
  10. 捷径app 保存视频_Android N App捷径
  11. oracle数据库如何写翻页_ORACLE翻页SQL语句
  12. Android设计模式之单例模式
  13. android 控件字体反向,Android编程实现控件不同状态文字显示不同颜色的方法
  14. SQL Server 百度网盘免费下载
  15. 从数学角度看基金定投
  16. FB15K-237知识图谱数据集的介绍与分析,Freebase
  17. 给学计算机男生起外号,如何给男生起外号
  18. python黑白图片上色_百度AI攻略:黑白图片上色
  19. 伦斯勒理工学院计算机科学专业强吗,伦斯勒理工学院计算机专业申请条件(附案例)...
  20. springCloud 授权服务器

热门文章

  1. Clion 2020.2 使用 C++20 等C++标准 编程
  2. 我的世界 文件保存位置
  3. 深圳农村商业银行转账显示服务器无响应,深圳农村商业银行
  4. android倒计时功能,Android 实现列表倒计时功能
  5. python 柱状图 居中_python matplotlib模块: bar(柱状图)
  6. 线段树递归和非递归实现+hdu1166 敌兵布阵
  7. C/C++ 之 C发展史及 各标准特性说明
  8. Cpp 对象模型探索 / 静态局部对象只构造一次的原因和执行析构的方法
  9. C\C++ 结构体初始化的四种方法
  10. linux id高 负载高,linux下的rsync连接数突然增高,负载增高导致服务登录失败