c++中的printf和fprintf
printf("%s",stringVar) <===>fprintf(stdout,"%s",stringVar)
printf是对fprintf的另一层包含使用,printf其实就是fprintf的第一个参数设置为stdout。
printf默认了操作的文件为标准输出文件stdout,而fprintf可以指定第一个参数为操作的文件,
这个文件和标准输出设备(屏幕)建立了某种关联,当数据写到这个文件里面的时候,屏幕就会通过既定的方式把你写进去的东西显示出来。
C++中rdbuf()简介及文件流的概念
#include <cstring>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
//****************个人对流操作中<<和>>符号的理解********************
//////////////////////////////////////////////////////////////////////////
/// 可以这么认为:可以根据<< 或 >>箭头的方向来理解流的过程.
/// 比如:cout<<n; 由于<<箭头方向向左,所以意思就是将n的值流入cout
/// cout是标准输出流,所以cout<<n;就把n显示到了屏幕上.
/// 对于cin>>n;来说由于>>箭头方向向右,所以意思就是将cin中的数据
/// 流入n变量,cin是标准输入流,所以cin>>n;就把屏幕上的数据写入n
/// 变量.也就是说箭头的方向相当于流的方向,也就是数据的流向.对于其他
/// 流对象(xxxstream)也是一样的道理.
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
/// C++流对象函数rdbuf()简介:
/// rdbuf()可以实现一个流对象指向的内容用另一个流对象来输出,比如想把
/// 一个文件的内容输出到显示器上,我们可以两行代码完成:
/// ifstream infile("test.txt");
/// cout << infile.rdbuf();
//////////////////////////////////////////////////////////////////////////
#if 0
int main()
{
ifstream infile("test.txt");
cout << infile.rdbuf(); //把infile流对象中的流重定向到标准输出cout上
return 0;
}
#endif
//////////////////////////////////////////////////////////////////////////
/// 一个简单的文件复制示例,简化了C语言繁琐的操作(循环读取)
//////////////////////////////////////////////////////////////////////////
#if 1
int main()
{
fstream infile("test.txt", ios::in);
if (!infile.is_open())
{
cout << "源文件打开失败..." << endl;
return -1;
}
fstream outfile("test.bak.txt", ios::out);
if (!outfile.is_open())
{
cout << "目标文件打开失败..." << endl;
return -1;
}
outfile<<infile.rdbuf(); //将infile流中的数据传入outfile流中
infile.close();
outfile.close();
return 0;
}
#endif
C++中使用stringstream 简化类型转换
C++标准库中的<sstream>提供了一个stringstream,以前基本没用过,突然发现很好用(^-^)V
参见 http://www.cplusplus.com/reference/sstream/stringstream/
如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;
在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。
如何用使用stringstream进行类型转换:
1. 下面例子为整型和sting类型的相互转换示例
整型转换为字符串类型
string NumberToString(int num)
{
stringstream ss;
ss<<num; //像流中传值
string result;
ss>>result; //将流中的值写入到result
return result;
}
字符创类型转换为整型
int StringToNumber(string strNum)
{
stringstream ss;
ss<<strNum;
int result;
ss>>result;
return result;
}
编译期就确定了num,result,strNum的类型,调用stringstream的时候拥有足够的信息判断来进行自动转换,并将转换结果缓存到stringstream对象的内部缓冲中
stringstream对象会根据需要自动分配内存,不用担心溢出问题.
例如:
float n = 22.22;
string strNum = "22.22";
cout<<StringToNumber(strNum)<<endl;
cout<<NumberToString(n)<<endl;
输出:22 22
2. 任意类型的转换
template <class output_type,class input_type>
output_type Convert(const input_type &input)
{
stringstream ss;
ss<<input;
output_type result;
ss>>result;
return result;
}
例如:
float n = 22.22;
string strNum = "22.22";
float f = Convert<float>(strNum);
cout<<f<<endl;
string ss = Convert<string>(n);
cout<<ss<<endl;
输出: 22.22 22.22
3. 自定义类型的转换
<sstream>库还提供了另外一个特性—可扩展性,你可以通过重载来支持自定义类型间的转换,下次在探究
生命在于折腾,生活就是如此的丰富多彩