[C++]文件处理实例-基础版

#include "pch.h"
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iomanip>
using namespace std;
inline void eatline() { while (cin.get() != '\n') continue; }
struct planet
{
    char name[20];
    double population;
    double g;
};
const char* file = "planets.dat";
int main(void) {
    planet pl;
    cout << fixed;
    
    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::out | ios::app | ios::binary);
    if (!fout.is_open()) {
        cerr << "Can't open " << file << " file for output.\n";
        exit(EXIT_FAILURE);
    }
    cout << "Enter guest names (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);
    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";
    return 0;
}

 

const int LIM = 20;
struct planet
{
    char name[LIM];
    double population;
    double g;
};
const char* file = "planets.dat";
inline void eatline() { while (cin.get() != '\n') continue; }
int main(void) {
    planet pl;
    cout << fixed << right;
    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(20) << pl.name << ": " << setprecision(0) << setw(12) << pl.population << setprecision(2) << setw(6) << pl.g << endl;
            //cout << setw(20) << 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 number -- 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;
    }
    finout.close();
    cout << "Done.\n";
    return 0;
}

 

posted @ 2019-03-07 21:12  Lightmonster  阅读(327)  评论(0)    收藏  举报