C++文件操作与文件流学习

来源:互联网 发布:pdf.js 打开 word文档 编辑:程序博客网 时间:2024/06/17 10:54

一:对ASCII码的文件

// c_datastructure.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<iostream>#include<fstream>#include<iomanip>#include<string>using namespace std;void inputFile(char *);void outputFile(char *);int main(){cout << "************" << endl;inputFile("f1.txt");outputFile("f1.txt");    return 0;}void inputFile(char *fileName) {int a[10];// 定义文件流对象,打开模式(进行输入操作)打开磁盘文件fa.txtofstream outfile(fileName, ios::out);// 如果打开失败,返回错误信息if (!outfile) {cerr << "open error!" << endl;exit(1);}cerr << "enter 10 number:" << endl;// 向磁盘文件f1.txt输出数据for (int i = 0; i < 10; i++) {cin >> a[i];outfile << a[i] << " ";}// 流操作务必结束后关闭outfile.close();}void outputFile(char *fileName) {int a[10], max, order;// 定义文件流对象,输入模式(输出操作)打开磁盘文件fa.txtifstream infile("f1.txt", ios::in);if (!infile) {cerr << "open error" << endl;exit(0);}for (int i = 0; i < 10; i++) {infile >> a[i];cout << a[i] << " ";}cout << endl;max = a[0];order = 0;for (int i = 1; i < 10; i++) {if (a[i] > max) {max = a[i];order = i;}}cout << "Max = " << max << ", " << "order = " << (order + 1) << endl;// 关闭流操作符infile.close();}



二:对二进制的文件

C++对二进制的读写操作主要由istream类的成员函数read和write完成。

istream& read(char *buffer, int len);ostream& write(const char *buffer, int len);
write函数的第一参数是const类型,因为不允许通过指针改变其指向的数据的值
// c_datastructure.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<iostream>#include<fstream>#include<iomanip>#include<string>using namespace std;void inputFile(char *);void outputFile(char *);void inputFile_binary(char *);void outputFile_binary(char *);struct Student {char name[20];int num;int age;char sex;};int main(){cout << "************" << endl;inputFile_binary("student.dat");outputFile_binary("student.dat");    return 0;}void inputFile(char *fileName) {int a[10];// 定义文件流对象,打开模式(进行输入操作)打开磁盘文件fa.txtofstream outfile(fileName, ios::out);// 如果打开失败,返回错误信息if (!outfile) {cerr << "open error!" << endl;exit(1);}cerr << "enter 10 number:" << endl;// 向磁盘文件f1.txt输出数据for (int i = 0; i < 10; i++) {cin >> a[i];outfile << a[i] << " ";}// 流操作务必结束后关闭outfile.close();}void outputFile(char *fileName) {int a[10], max, order;// 定义文件流对象,输入模式(输出操作)打开磁盘文件fa.txtifstream infile("f1.txt", ios::in);if (!infile) {cerr << "open error" << endl;exit(0);}for (int i = 0; i < 10; i++) {infile >> a[i];cout << a[i] << " ";}cout << endl;max = a[0];order = 0;for (int i = 1; i < 10; i++) {if (a[i] > max) {max = a[i];order = i;}}cout << "Max = " << max << ", " << "order = " << (order + 1) << endl;// 关闭流操作符infile.close();}void inputFile_binary(char *fileName) {// 初始化结构体数组Student stu[3] = { "Li",1001,18,'m',"Wang",1002,20,'f',"Peng",1003,22,'m' };// 定义文件流对象,以二进制模式ofstream outfile(fileName, ios::binary);if (!outfile) {cerr << "open error" << endl;abort();}// 调用write进行写入操作// 将结构体数组[i[元素输出到磁盘文件上,&stu[i]是结构体数组的一个元素的首地址// 但是write函数要求这应该是指向结构体的指针,与形参不匹配,所以使用(char *)// 将其强制转换为字符指针for (int i = 0; i < 3; i++) {outfile.write((char *)&stu[i], sizeof(stu[i]));}// 关闭流outfile.close();}void outputFile_binary(char *fileName) {Student stu[3];int i;ifstream infile(fileName, ios::binary);if (!infile) {cerr << "open error" << endl;abort();}for (i = 0; i < 3; i++) {infile.read((char *)&stu[i], sizeof(stu[i]));}infile.close();for (i = 0; i < 3; i++) {cout << "NO. " << i + 1 << endl;cout << "name: " << stu[i].name << endl;cout << "num: " << stu[i].num << endl;cout << "age: " << stu[i].age << endl;cout << "sex: " << stu[i].sex << endl;cout << endl;}}


三:综合练习

需求:

有五个学生数据:

1.把他们存入磁盘文件中。

2.把磁盘文件第1,3,5个学生的数据读入程序,然后显示出来。

3.将第3个学生的数据修改后存回磁盘文件中原来的位置。

4.从磁盘文件读入修改后的5个学生数据并且显示出来。

分析:

由于需要对文件进行频繁的操作(输入输出),因此将文件工作模式指定成输入输出文件,ios::in|ios::out|ios::binary。然后计算好每次访问的指针的位置,正确使用seekg或者seekp函数。

// c_datastructure.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<iostream>#include<fstream>#include<iomanip>#include<string>using namespace std;struct Student {int num;char name[20];int score;};int main(){cout << "************" << endl;Student stud[5] = {1001,"Li",85,1002,"Wl",90,1003,"Yi",99,1004,"Ch",89,1005,"Wkk",97};fstream iofile("Student.dat", ios::in | ios::out | ios::binary);if (!iofile) {cerr << "open error" << endl;abort();}for (int i = 0; i < 5; i++)iofile.write((char *)&stud[i], sizeof(stud[i]));Student ss[5];for (int i = 0; i < 5; i += 2) {// 分别定位第1,3,5个学生的数据开头iofile.seekg(i * sizeof(stud[i]), ios::beg);iofile.read((char *)&ss[i / 2], sizeof(ss[0]));cout << ss[i / 2].num << "  " << ss[i / 2].name << "  " << ss[i / 2].score << endl;cout << endl;}cout << endl;stud[2].num = 1009;strcpy(stud[2].name, "KKii");stud[2].score = 98;// 定位第3个学生数据开头iofile.seekg(2 * sizeof(stud[0]), ios::beg);iofile.write((char *)&stud[2], sizeof(stud[2]));iofile.seekg(0, ios::beg);for (int i = 0; i < 5; i++) {iofile.read((char *)&ss[i], sizeof(ss[i]));cout << ss[i].num << "  " << ss[i].name << "  " << ss[i].score << endl;cout << endl;}    return 0;}