文件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;
}