C/C++文件输入输出(详细介绍)

 如果有需要请关注下面微信公众号,会有更多收获!

´在头文件iostream中定义两个流类:输入流类istream和输出流类ostream,且用这两个类定义了流对象cincout:

´Istream cin;

´ostream cout;

´cin是一个istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“>>”从流中提取数据。流提取符“>>”从流中提取数据时通常跳过输人流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。注意保证从流中读取数据能正常进行

´cout是一个ostream类的对象,它有一个成员运算函数operator<<,每次调用的时候就会向输出设备输出。operator用运算符重载,可以接受不同类型的数据,如整型、浮点型、字符串甚至指针,等等cout是标准输出设备,一般输出到屏幕。

在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据

C++iostreamCprintf/scanf的区别

´1. 类型处理更安全、智能,printf中对付intfloat等说明符比较麻烦

´2. 扩展性更强,iostream使用的<<>>操作符都是可重载,只要重载相关的运算符就可以

´ 3. 流风格的写法也比较自然简洁

´4. printf/scanf的速度比cin/cout

几个输入函数介绍:

´1cin.get()

´ cin.get(字符变量名)可以用来接收字符

´cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
2cin.getline(接收字符串的变量,接收字符个数,结束字符)用法:接收一个字符串,可以接收空格并输出

3getline()用法:接收一个字符串,可以接收空格并输出,需包含“#include<string>”

´注意:cin.getline()属于istream流,而getline()属于string流,是不一样的两个函

文件I/O也称为读文件(输入)和写文件(输出),c++标准库中提供两个类ifstreamofstream,分别用于文件的输入和输出。

.文件的写操作:

写操作对应的有:<<putwrite 等,我们来看下他们分别都能实现什么样的写文件功能!

①、写文本类型/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指定的文件中。标准流文件具体是指stdinstdoutstderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认

输入一个正整数nn<100n从文件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;
}

猜你喜欢

转载自blog.csdn.net/xyqqwer/article/details/83471973