第九站(17天):C++IO流

发布时间:2024年01月18日

文件IO流?

?对象:文件,控制台,特定数据类型stringstream

(写数据输出流out,读数据输入流in)

ofstream :

ofstream outfile;//输出流:从键盘输出数据,写入到文件
????????//文件打开默认位ios::out//字节覆盖写
????????//可以截断设置为:ios::out | ios::trunc//将之前文件全部截断为0,重新开始写

//cout也是一种标准输出流
????????cout << "请输入姓名: ";
//cin是标准输入流,将控制台的数据读取,输入到变量name中
????????cin >> name;

#include <iostream>;
#include <fstream>

using namespace std;

int main(void) {
	string name;
	int age = 0;
	ofstream outfile;//输出流:从键盘输出数据,写入到文件
	//文件打开默认位ios::out//字节覆盖写
	//可以截断设置为:ios::out | ios::trunc//将之前文件全部截断为0,重新开始写
	outfile.open("user.txt",ios::out | ios::trunc);
	while (true){
		//cout也是一种标准输出流
		cout << "请输入姓名: ";
		//cin是标准输入流,将控制台的数据读取,输入到变量name中
		cin >> name;
		if (cin.eof())
		{
			break;
		}
		outfile << name << "\t";
		cout << "请输入年龄: ";
		cin >> age;
		outfile << age<<endl;
	}
	
	outfile.close();
	system("pause");
	return 0;
}

ifstream:

?ifstream infile;//输入流:从文件读取数据,再由cout输出流,写到控制台?

#include <iostream>;
#include <fstream>

using namespace std;

int main(void) {
	string name;
	int age;
	ifstream infile;

	infile.open("user.txt");
	while (true) {
		infile >> name;
		
		if (infile.eof())
		{
			break;
		}
		cout << name << "\t";
		infile >> age;
		cout << age << endl;
	}
	infile.close();
	system("pause");
	return 0;
}

?用文件流写读二进制文件(write)

note++查看二进制文件的插件:

?

?

#include <iostream>
#include <fstream>
using namespace std;

int main(void) {
	string name;
	int age;
	ofstream outfile;
	outfile.open("user.dat", ios::out | ios::trunc | ios::binary);
	while (1){
		cout << "请输入姓名:";
		cin >> name;
		if (cin.eof()) {
			break;
		}
		outfile << name<<"\t";
		//这里的age是整形的,在输出流之后自动被转换成字符串了
		//这里写age需要指定格式
		cout << "请输入年龄:";
		cin >> age;
		outfile.write((char*)&age, sizeof(int));
		cout << endl;
	}
outfile.close();
return 0;
}

?用文件流读取二进制文件(read)

?

#include <iostream>
#include <fstream>
using namespace std;

int main(void) {
	string name;
	int age;
	ifstream infile;
	infile.open("user.dat", ios::in | ios::binary);
	while (1) {
		infile >> name;
		if (infile.eof()) {
			break;
		}
		cout << "姓名:" << name << "\t";
		char tmp;
		infile.read(&tmp, sizeof(tmp));
		infile.read((char*)&age, sizeof(age));
		cout << "年龄:" << age << endl;
	}
infile.close();
return 0;
}

?指定格式进行写文件

?

#include <iostream>
#include <sstream>
#include <fstream>

using namespace std;

int main(void) {
	string name;
	int age;
	ofstream outfile;
	outfile.open("user.txt", ios::out | ios::trunc);
	while (1){
		cout << "请输入姓名:";
		cin >> name;
		if (cin.eof()) {
			break;
		}
		cout << "请输入年龄:";
		cin >> age;
		stringstream res;
		res << "姓名:" << name << "\t\t\t年龄:" << age << endl;
		//将数据输入字符流,转成字符串
		outfile << res.str();
		cout << endl;
	}
	outfile.close();
	return 0;
}

指定格式进行读取文件?

用C语言的sscanf_s(对象,"指定格式",数据);

#include <iostream>
#include <sstream>
#include <fstream>

using namespace std;

int main(void) {
	string line;
	int age;
	char name[32];
	ifstream infile;
	infile.open("user.txt", ios::in);
	while (1) {
		getline(infile,line);
		if (infile.eof()) {
			break;
		}
		//用空格去取代制表符,这个格式和文件一行的格式一样
		sscanf_s(line.c_str(), "姓名:%s 年龄:%d", name,sizeof(name), &age,sizeof(int));
		cout << "姓名: " << name << "\t\t\t年龄: " << age << endl;
	}
	infile.close();
	return 0;
}

文件的随机读写

设置输入流的位置seekg(偏移量,起始位置(beg,cur,end))

?

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

int main() {
	//返回文件最后五十个字节的数据
	
	ifstream infile;
	infile.open("偏移量.cpp");
	if (!infile.is_open()) {
		cout << "文件打开失败!" << endl;
		return -1;
	}
	infile.seekg(-50, infile.end);
	while (!infile.eof()) {
		string name;
		getline(infile, name);
		cout << name << endl;
	}
	infile.close();
	return 0;
}

设置输出流的位置seekp(偏移量,起始位置(beg,cur,end))

??

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

int main() {
	string name;
	ofstream outfile;
	outfile.open("偏移量.cpp",ios::app);
	if (!outfile.is_open()) {
		cout << "文件打开失败!" << endl;
		return -1;
	}
	cout << "请输入一段话:";
	cin >> name;
	outfile.seekp(0, outfile.end);
	outfile << name;
	outfile.close();
	return 0;
}//爱上大额女权

tellg,返回该输入流的当前位置

?距离文件起始位置的偏移量,计算大小

?

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

int main() {
	ifstream infile;
	infile.open("偏移量.cpp");
	if (!infile.is_open()) {
		cout << "文件打开失败!" << endl;
		return -1;
	}
	infile.seekg(0, infile.end);
	cout <<"文件的大小:"<< infile.tellg() << endl;
	infile.close();
	return 0;
}

文件读写小练习

输入任意多个整数 , 把这些数据保存到文件 data.txt .
如果在输入的过程中 , 输入错误 , 则提示用户重新输入 .
指导用户输入结束 ( ctrl + z)
[ 每行最多保存 10 个整数 ]

//将标准输入缓冲区cin的所有数据都清空,同时也会清除判定符号'\n'
cin.ignore(std::numeric_limits<streamsize>::max(), '\n');?

#include <iostream>
#include <fstream>

using namespace std;
/*
输入任意多个整数, 把这些数据保存到文件 data.txt 中. 
如果在输入的过程中, 输入错误, 则提示用户重新输入.
指导用户输入结束(按 ctrl + z)

[每行最多保存 10 个整数]
*/
int main(void) {
	int num;//s输入的数据
	int n = 0;//用来计数
	ofstream stream;
	stream.open("data.txt",ios::out|ios::trunc);

	if (!stream.is_open()) {
		cout << "文件打开失败!" << endl;
		exit(1);
	}

	//开始输入数据
	while(1){
		cout << "请输入一个整数:" ;
		cin >> num;
		if (cin.eof())
		{
			break;
		}
		if (cin.fail()){
			cout << "输入错误请重新输入:";
			cin.clear();
			//将标准输入缓冲区cin的所有数据都清空,同时也会清除判定符号'\n'
			cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
			cin >> num;
		}
		stream << num <<" ";
		if ((++n)%10==0)
		{
			stream<< endl;
		}
	}
	stream.close();
}

?从练习 2 中的 num.txt 文件读取各个整数, 打印出最大值和最小值, 以及平均值.

?

#include<iostream>;
#include <fstream>
using namespace std;

int main(void) {

	int max, min, n = 0, sum = 0;
	int num;
	//使用输入流读取文件
	ifstream stream;
	stream.open("data.txt");
	if (!stream.is_open()){
		cout << "文件打开失败!" << endl;
		exit(1);
	}
	stream >> num;
	max = num;
	min = num;
	sum += num;
	n++;
	while (1){
		stream >> num;
		if (stream.eof()){
			break;
		}
		if (num>max){
			max = num;
		}else if(num<min){
			min = num;
		}
		sum += num;
		n++;
	}
	cout << "max:" << max << endl;
	cout << "min:" << min << endl;
	cout << "avg:" << sum / n << endl;
	cout << "n=" << n << endl;
}
文章来源:https://blog.csdn.net/qq_48397625/article/details/135637810
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。