C++文件操作案例
案例一:
1.打开文件,显示其中内容
2.向其中追加记录
3.显示追加之后的文件内容
#include<iostream>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
using namespace std;
inline void eatline() { while (std::cin.get() != '\n')continue; }
struct planet
{
char name[20];
double population;
double g;
};
const char* file = "planets.dat";
int main()
{
planet pl;
cout << fixed << right;
ifstream fin;
fin.open(file, ios_base::in | ios_base::binary);
if (fin.is_open())
{
cout << "Here are the current contents of the " << file << "file:\n";
while (fin.read((char*)&pl, sizeof pl))
{
cout << setw(20) << pl.name << ": "
<< setprecision(0) << setw(12) << pl.population
<< setprecision(2) << setw(6) << pl.g << endl;
}
fin.close();
}
ofstream fout(file, ios_base::out | ios_base::app | ios_base::binary);
if (!fout.is_open())
{
cerr << "Can't Open " << file << "fiel for output:\n";
exit(EXIT_FAILURE);
}
cout << "Enter plant name(Enter a blank line to quit):\n";
cin.get(pl.name, 20);
while (pl.name[0] != '\0')
{
eatline();
cout << "Enter planetary population:";
cin >> pl.population;
cout << "Enter planet's acceleration of gravity:";
cin >> pl.g;
eatline();
fout.write((char *)&pl, sizeof pl);
cout << "Enter planet name (Enter a blank line to quit):\n";
cin.get(pl.name, 20);
}
fout.close();
fin.clear();
fin.open("file, ios_base::in | ios_base::binary);
if (fin.is_open())
{
cout << "Here are the new contents of the " << file << "file:\n";
while (fin.read((char*)&pl, sizeof pl))
{
cout << setw(20) << pl.name << ": "
<< setprecision(0) << setw(12) << pl.population
<< setprecision(2) << setw(6) << pl.g << endl;
}
fin.close();
}
cout << "Done!\n";
}
案例二:
1.打开文件显示其中内容
2.选择要修改的记录
3.显示选中的要修改的记录
4.修改记录
5.显示修改之后的内容
#include<iostream>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
using namespace std;
const int LIM = 20;
struct planet
{
char name[LIM];
double population;
double g;
};
const char* file = "Planet.dat";
inline void eatline() { while (cin.get() != '\n')continue; }
int main()
{
/*ofstream fout("Planet.dat");
fout.close();*/
planet pl;
cout << fixed;
fstream finout;
finout.open(file, ios_base::in | ios_base::out | ios_base::binary);
int ct = 0;
if (finout.is_open())
{
finout.seekg(0);
cout << "Here are the current contents of the " << file << "file:\n";
while (finout.read((char *)&pl,sizeof pl))
{
cout << ct++ << ": " << setw(LIM) << pl.name << ": "
<< setprecision(0) << setw(12) << pl.population
<< setprecision(2) << setw(6) << pl.g << endl;
}
if (finout.eof())
{
finout.clear();
}
else
{
cerr << "Error in reading" << file << ".\n";
exit(EXIT_FAILURE);
}
}
else
{
cerr << file << "could not be opened--bye.\n";
exit(EXIT_FAILURE);
}
cout << "Enter the record number you wish to change: ";
long rec;
cin >> rec;
eatline();
if (rec<0 || rec >= ct)
{
cerr << "Invalid record bumber --bye \n";
exit(EXIT_FAILURE);
}
streampos place = rec * sizeof pl;
finout.seekg(place);
if (finout.fail())
{
cerr << "Error on attempted seek\n";
exit(EXIT_FAILURE);
}
finout.read((char *)&pl, sizeof pl);
cout << "Your selection:\n";
cout << rec << ": " << setw(LIM) << pl.name << ": "
<< setprecision(0) << setw(12) << pl.population
<< setprecision(2) << setw(6) << pl.g << endl;
if (finout.eof())
{
finout.clear();
}
cout << "Enter planet name: ";
cin.get(pl.name, LIM);
eatline();
cout << "Enter planetary population: ";
cin >> pl.population;
cout << "Enter planet's acceleration of gravity: ";
cin >> pl.g;
finout.seekp(place);
finout.write((char*)&pl, sizeof pl) << flush;
if (finout.fail())
{
cerr << "Error on attempted write\n";
exit(EXIT_FAILURE);
}
ct = 0;
finout.seekg(0);
cout << "Here are the new contents of the " << file << " file:\n";
while (finout.read((char *)&pl,sizeof pl))
{
cout << ct++ << ":" << setw(LIM) << pl.name << ": "
<< setprecision(0) << setw(12) << pl.population
<< setprecision(2) << setw(6) << pl.g << endl;
}
cout << "Done!\n";
return 0;
}