´在头文件iostream中定义有两个流类:输入流类istream和输出流类ostream,且用这两个类定义了流对象cin和cout:
´Istream cin;
´ostream cout;
´cin是一个istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“>>”从流中提取数据。流提取符“>>”从流中提取数据时通常跳过输人流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。注意保证从流中读取数据能正常进行。
´cout是一个ostream类的对象,它有一个成员运算函数operator<<,每次调用的时候就会向输出设备输出。operator用运算符重载,可以接受不同类型的数据,如整型、浮点型、字符串甚至指针,等等。cout是标准输出设备,一般输出到屏幕。
在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。
C++的iostream与C的printf/scanf的区别
´1. 类型处理更安全、智能,printf中对付int、float等说明符比较麻烦
´2. 扩展性更强,iostream使用的<<、>>操作符都是可重载,只要重载相关的运算符就可以;
´ 3. 流风格的写法也比较自然简洁
´4. printf/scanf的速度比cin/cout快
几个输入函数介绍:
´1、cin.get()
´ cin.get(字符变量名)可以用来接收字符
´cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
2、cin.getline(接收字符串的变量,接收字符个数,结束字符)用法:接收一个字符串,可以接收空格并输出
3、getline()用法:接收一个字符串,可以接收空格并输出,需包含“#include<string>”
´注意:cin.getline()属于istream流,而getline()属于string流,是不一样的两个函
文件I/O也称为读文件(输入)和写文件(输出),c++标准库中提供两个类ifstream和ofstream,分别用于文件的输入和输出。
一.文件的写操作:
写操作对应的有:<<、put、write 等,我们来看下他们分别都能实现什么样的写文件功能!
①、写文本类型/ASCII码类型的可见字符串:<<、put
int main(){
short var = 20000;
ofstream fs;
fs.open("1.txt");
if (!fs) return 0;
fs << var << endl;
fs << "文件写入" << endl;
fs.put('Y');
fs.close();
return 0;
}
这就是写文本文件的方式,其中 << 支持的类型比较多,put 只能写单个字符到文件,还是有一定局限性的,所以 put 平时用的比较少
参考网站:http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/
C/C++重定向 标准输入输出的库函数
´所谓重定向输出,就是可以把原本只是输出在控制台的字符,输出到你指定的路径文件中。(输入类似,就是从指定的文件中读取,而不是读取在控制台中的输入。)重定向函数可以在任何时候开启、关闭。
´函数名:freopen
´标准声明:FILE *freopen( const char *path, const char *mode, FILE *stream );
´所在文件: <stdio.h>
参数说明: path: 文件名,用于存储输入输出的自定义文件名。 mode: 文件打开的模式。和fopen中的模式(如r读, w写)相同。 stream: 一个文件,通常使用标准流文件。 返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认
输入一个正整数n(n<100,n从文件in.txt读入),求n的阶乘(答案写入文件out.txt)。
//c++语法
#include<iostream>
#include<stdio.h>
using namespace std;
int fac(int n){
return (n==1)? 1:n*fac(n-1);
}
int main(){
int n,m;
freopen("in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取
freopen("out.txt","w",stdout); //输出重定向,输出数据将保存out.txt文件中
while(cin>>n){
//m=fac(n);
cout<<"输入n的阶乘为:"<<fac(n)<<endl; // 注意使用endl
}
fclose(stdin);//关闭重定向输入
fclose(stdout);//关闭重定向输出
return 0;
}
//c语法
#include<stdio.h>
int fac(int n){
return (n==1)? 1:n*fac(n-1);
}
int main(){
int n,m;
freopen("in2.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取
freopen("out2.txt","w",stdout); //输出重定向,输出数据将保存out.txt文件中
while(scanf("%d %d",&n,&m)!=EOF){
printf("n的阶乘为:%d\n",fac(n));
}
fclose(stdin);//关闭重定向输入
fclose(stdout);//关闭重定向输出
return 0;
}
getline()该函数是从文件中读取一行数据,一行就是有换行符 \n,或者达到 getline 的缓冲区大小,或者读到文件末尾。
#include <fstream>
using namespace std;
int main(int argc, char* argv[]){
short var = 20000;
ofstream fs_out;
fs_out.open("d:\\123.txt");
if (!fs_out) return 0;
fs_out << var << endl;
fs_out << var + 1 << endl;
fs_out << var + 2 << endl;
fs_out.close();
ifstream fs_in;
fs_in.open("d:\\123.txt");
if (!fs_in) return 0;
char sz[100] = { 0 };//缓存区
fs_in.getline(sz, 100);
fs_in.getline(sz, 100);
fs_in.getline(sz, 100);
fs_in.close();
return 0;
}
//②、二进制类型写文件:write
int main(){
short var = 20000;
ofstream fs;
fs.open("3.txt");
if (!fs) return 0;
fs.write((char*)&var, sizeof(var));
fs.close();
return 0;
}
//①、读文本类型/ASCII码类型的文件:>>、get、getline
int main(){
short var = 20000;
ofstream fs_out;
fs_out.open("4.txt");
if (!fs_out) return 0;
fs_out << var << endl;
fs_out.close();
var = 3000;
ifstream fs_in;
fs_in.open("4.txt");
if (!fs_in) return 0;
fs_in >> var;
char ch = fs_in.get();
fs_in.close();
return 0;
}