C++学习笔记30:文件读写(一)

1 文件和流

    -- 可以将顺序文件看做一个有限字符构成的顺序字符流,然后像对cin, cout一样的读写
    -- ios --> istream --> ifstream:从文件中读取数据的流
    -- ios --> ostream --> ofstream:向文件中写入数据的流
    -- fstream:既可以读一个文件,也可以写一个文件

2 创建文件

    -- #include <fstream>   // 包含头文件
    -- ofstream outFile("clients.dat", ios::out|ios::binary);   // 在构造函数中将文件创建出来
        - clients.dat:要创建文件的名字
        - ios::out  // 文件打开方式
            ios::out    // 输出到文件,删除原有内容
            ios::app    // 输出到文件,保留原有内容,总是在尾部添加
        - ios::binary   // 以二进制文件格式打开文件
    -- 也可以先创建ofstream对象,再用open函数打开
        ofstream fout;
        fout.open("test.out", ios::out|ios::binary);
    -- 判断打开是否成功
        if(!fout)
        {
            cout << "File open error!" << endl;
        }
    -- 文件名可以给出绝对路径,也可以给出相对路径。没有交代路径信息,就是在当前文件夹下找文件

3 文件名的绝对路径和相对路径

    -- 绝对路径
        “c:\\tmp\\mydir\\some.txt”
    -- 相对路径
        “\\tmp\\mydir\\some.txt”    // 当前盘符的根目录下的tmp\dir\some.txt
        "tmp\\mydir\\some.txt"      // 当前文件夹的tmp的子文件夹里面的......
        "..\\tmp\\mydir\\some.txt"  // 当前文件夹的父文件夹下面的tmp子文件夹里面的......
        "..\\..\\tmp\\mydir\\some.txt"  // 当前文件夹的父文件夹下面的tmp子文件夹里面的......

4 文件的读写指针

    -- 对于输入文件,有一个读指针
    -- 对于输出文件,有一个写指针
    -- 对于输入输出文件,有一个读写指针
    -- 标识文件操作的当前位置,该指针在哪里,读写操作就在哪里进行

5 文件的写指针

    ofstream fout("a1.out", ios::app);  // 以添加的方式打开
    long location = fout.tellp();       // 取得写指针的位置
    location = 10;
    fout.seekp(location);               // 将写指针移动到第10个字节处
    fout.seekp(location, ios::beg);     // 从头数location
    fout.seekp(location, ios::cur);     // 从当前位置数location
    fout.seekp(location, ios::end);     // 从尾部数location
    注意:location可以为负值

6 文件的读指针

    ifstream fin("a1.in", ios::ate);    // 打开文件,定位文件指针到文件尾,意义在于可以取文件的长度
    long location = fin.tellg();        // 取得读指针的位置,也就是文件长度
    location = 10L;
    fin.seekg(location);                // 将读指针移动到第10个字节处
    fin.seekg(location, ios::beg);      // 从头数location
    fin.seekg(location, ios::cur);      // 从当前位置数location
    fin.seekg(location, ios::end);      // 从尾部数location
    注意:location可以为负值

7 字符文件读写

    -- 因为文件流也是流,所以流的成员函数和流操作算子也同样适用于文件流
    -- 写一个程序,将文件in.txt里面的整数排序,输出到out.txt
       eg: 如果in.txt的内容为: 1 234 9 45 6 879
           则执行本程序后,生成的out.txt的内容为: 1 6 9 45 234 879
       案例(见本工程zifuwenjianduxie.cpp)
/**
 * 演示字符文件读写
 *
 * 写一个程序,将文件in.txt里面的整数排序,输出到out.txt
 */

#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>

using namespace std;

int main()
{
    vector<int> v;  // 可变长数组
    ifstream srcFile("text.txt", ios::in);    // 因为它是纯文本文件,不需要以二进制方式打开
    ofstream destFile("out.txt", ios::out);
    int x;
    // cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符
    while(srcFile >> x)
    {
        // cout << x << endl;
        v.push_back(x);     // 将x加到数组v中
    }

    sort(v.begin(), v.end());   // 将数组v进行排序
    for(int i = 0; i < v.size(); i++)
        destFile << v[i] << " ";
    // 关闭文件
    destFile.close();
    srcFile.close();
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值