C++ 输入输出流 知识点 例代码 总结

使用ostream,istream通用输入输出流时,通常情况下不用创建对象,可以直接使用,文本主要针对需要创建对象的文件输入输出流和字符串输入输出流

1.文件输出流ofstream

包含文件#include<fstream>

将内存或内容输出到关联文件

输出到文件里面还可以用<<,输出流对象和cout一样,cout是输出到终端(显示器),流对象绑定文件,就是输出到文件中

cout<<

file<<

①open函数

用途:把该输出流与一个特定磁盘文件关联起来

语法

ofstream file("filename",打开模式);

ofstream file;

file.open("filename",打开模式);

打开模式

可以用按位或符号"|"组合多种模式

模式标志描述
ios_base::app追加模式。所有写入都追加到文件末尾。
ios_base::ate文件打开后定位到文件末尾。
ios_base::in打开文件用于读取。(可以避免删除文件现存内容)
ios_base::out打开文件用于写入。(默认)
ios_base::trunc

如果该文件已经存在,删除原有内容(默认)

ios_base::binary以二进制模式打开一个文件(默认文本模式)

②close函数

语法

file.close()

③write函数

用途:把一个内存中的一块内容写到一个文件输出流中

格式:一个char指针(指向内存数据的其实地址)+ 字节数

// 文件输出流
#include<fstream>
using namespace std;
struct Date {
	int monday, day, year;
};
int main() {
	Date dt = { 6,10,92 };
	// 以二进制形式打开
	ofstream file("文件路径", ios_base::binary);
    // 显示转换该对象地址的类型
	file.write(reinterpret_cast<char*>(&dt), sizeof(dt));
	file.close();
	return 0;
}

④put函数

用途:把字符写到输出流中

cout.put('A');

相当于cout<<'A';

⑤seekp.tellp函数

用途:一个文件输出流保存一个内部指针指向下一次写数据的位置

seekp设置这个指针,tellp返回该文件位置值(streampos类型值,可以进行自动类型转换,也就是说可以用一个整型变量接收该函数的返回值,表示所指当前位置)

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main() {
	ofstream file("filename");
	const char* str = "Hello World!";
	// 逐个输出到文件
	for (int i = 0; i < strlen(str); i++) {
		file.put(str[i]);
	}
	cout << "当前位置:" << file.tellp() << endl;
	file.seekp(23);    //返回值是一个输出流对象
	// file.seekp(23,ios::beg); 从头开始偏移 
	// file.seekp(-6,ios::cur); 从当前开始偏移
	// file.seekp(-6,ios::end); 从尾开始偏移
	cout << "新插入位置:" << file.tellp() << endl;
	// 从显示的下一个位置插入
	file.write(" hello", 6); // 格式:指针+长度
	file.close();
	return 0;
}
/*
输出:
当前位置:12
新插入位置:23
*/

2.字符串输出流ostringstream

包含文件#include<sstream>

#include<iostream>
#include<sstream>
#include<string>
using namespace std;

template<class T>
// 该函数模板可以把任何支持<<插入符的对象转换为字符串
inline string tostring(const T& v) {
	ostringstream os;
	// 创造字符串输出流
	os << v;
	// 将变量v的值写入字符串流
    // str()是字符串输出流的内置函数
	return os.str();
	// 返回输出流生成的字符串
}

int main() {
    // 输出都是字符串形式
	string str1 = tostring(5);
	cout << str1 << endl;
	string str2 = tostring(1.2);
	cout << str2 << endl;
	string str3 = tostring("Hello World");
	cout << str3 << endl;
	return 0;
}

3.文件输入流ifstream

包含文件:#include<fstream>

构造输入流对象->用文件流对象从文件读取数据

输入到变量里面还可以用>>,输入流对象和cin一样,cin是从键盘读入到变量里,输入流对象就是从连接的对象读入到变量里

cin>>

file>>

①open函数

ifstream myfile;

myfile.open("filename");

提取运算符>>不能读入空格

ios_base::in打开文件用于读取。(默认)
ios_base::binary以二进制模式打开一个文件(默认文本模式)

②close函数(与输出流一样)

用于手动关闭打开的文件

③get函数

读取一个字符,与提取运算符>>很相像,但是可以读取空白字符

// get读取单个字符
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main() {
	char ch;
    // 从键盘读入
	while ((ch = cin.get()) != EOF)
        // 输出到键盘
		cout.put(ch);
	return 0;
}

④getline函数

非成员函数:包含#include<string>

//从键盘读入
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main() {
	string line;
	// 可以指定终止字符
	// (一定要有终止字符,不指定则默认换行符,终止字符不读入)
	// cin表示从键盘读入
	getline(cin, line,'t');
	cout << line << endl;
	return 0;
}
// 输入
people today
// 输出
people
//从文件读入
#include<iostream>
#include<fstream>
#include<string>
#include<Windows.h>
using namespace std;

int main() {
	//输出流输入文件内容
	string line;
    //从键盘读取
	getline(cin, line);
	ofstream file1("filename",ios_base::out);
    //把line内容输入到文件
	file1.write(reinterpret_cast<char*>(&line), sizeof(line));
    //注意输出流可以这样输入,用<<符号,和cout一样,cout是输入到显示屏,这个是输入到文件
	//file1 << line << endl;
	file1.close();

	//输入流读取文件内容
	 string line2;
	 ifstream file2("filename", ios_base::in);
    //从文件读取
	 getline(file2, line2);
	 cout << line2 << endl;
	return 0;
}

⑤read函数

用途:读取文件内容到变量中

// 文件输出流(一个结构体)
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
struct Date {
	int monday, day, year;
};
int main() {
	//读入
	Date dt = { 6,10,92 };
	// 以二进制形式打开
	ofstream file("filename",ios_base::binary);
	// 显示转换该对象地址的类型,并且写入内容
	file.write(reinterpret_cast<char*>(&dt), sizeof(dt));
	file.close();

	//输出
    //以二进制打开
	ifstream is("filename", ios_base::in | ios_base::binary);
	if ( is ) {
		Date dt2;
        //读取文件内容并且存到dt2中
		is.read(reinterpret_cast<char*>(&dt2), sizeof(dt2));
		cout << dt2.monday << " " << dt2.day << " " << dt2.year << endl;
	}
    //添加打开错误提示
	else {
		cout << "ERROR to open file" << endl;
	}
	return 0;
}

⑥seekg.tellg函数

tellg返回类型是streampos

seekg返回的是输入流对象

// seekg.tellg
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main() {
	int values[] = { 3,7,0,5,4 };
	//建立一个输出流对象
	ofstream os("filename", ios_base::out | ios_base::binary);
	//写入内容
	os.write(reinterpret_cast<char*>(&values), sizeof(values));
	os.close();

	//建立一个输入流
	//输出指定位置
	ifstream is("filename", ios_base::in | ios_base::binary);
	if (is) {
		// 移动指针位置(移动三个到达第四个)
		is.seekg(3 * sizeof(int));
		int v;
        // is >> v;     也可以用这种格式
		is.read(reinterpret_cast<char*>(&v), sizeof(int));
		cout << "The 4th integer in the file is: " << v << endl;
	}
	is.close();

	//建立输入流对象
	//找出其中0元素的位置
	is.open("filename", ios_base::in | ios_base::binary);
	//打开时默认seekg,tellg在最开始的位置
	if (is) {
		is.seekg(1*sizeof(int));
		//seekg为tellg的起始位置
		while (is) {
			//每一次移动的是一个int单位
			//tellg的返回值是streampos类型,seekg不是,seekg用于移动
			streampos here = is.tellg();
			cout << here << endl;
			int v2;
			is.read(reinterpret_cast<char*>(&v2), sizeof(v2));
			if (is && v2 == 0) {
				cout << "Postition " << here << " is 0 " << endl;
			}
			//不用手动移动tellg
		}
	}
	is.close();
	return 0;
}
//输出
/*
The 4th integer in the file is : 5
4
8
Postition 8 is 0
12
16
20
*/

4.字符串输入流istringstream

包含文件:#include<sstream>

#include<iostream>
#include<sstream>
#include<string>
using namespace std;

template<class T>
inline T fromString(const string& str) {
	istringstream is(str);
	// 创建字符串输入流
	T v;
	is >> v;
	// 从字符串输入流中读取变量v
	return v;
	// 返回变量v
}

int main() {
    // 显示转换类型
	int v1 = fromString<int>("5");
	cout << v1 << endl;
	double v2 = fromString<double>("1.2");
	cout << v2 << endl;
	string v3 = fromString<string>("Hello World");
	cout << v3 << endl;
	// 只能输出Hello(不能读取空格)
	return 0;
}
  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值