C++文件输入和输出

1.引入头文件fstream
fstream头文件定义了用于文件输入的类ifstream和文件输出的类ofstream

2.写文件
1)创建一个ofstream对象来管理输出流
2)将该对象与文件关联起来
3)使用cout方式使用该对象,唯一区别是输出将进入文件,而不是屏幕。
4)关闭到文件的连接
示例如下:

ofstream fout;
fout.open("test.txt");
fout<<"write something";
fout.close();

创建对象和关联文件可使用构造函数合并到一步,以上代码等价于:

ofstream fout("test.txt");
fout<<"write something";
fout.close();

3.读文件
1)创建一个ifstream对象来管理输入流
2)将该对象与文件关联起来
3)使用ifstream的方法读文件
4)关闭到文件的连接
示例如下:

ifstream fin("test.txt");
char ch;
fin>>ch;//从文件中读取一个字符
char buf[80];
fin>>buf;//从文件中读取一个单词
fin.getline(buf,80);//从文件中读取一行
string line;
getline(fin,line);//读取一行转换成字符串
fin.close();

4.读写缓冲区
fstream流管理对象在使用cout或cin方式,读或写时,是通过缓冲区和文件进行交互的,
而不是逐字节读取或写入文件的。

关于close()函数,当流对象过期(如程序终止)时,到文件的连接自动关闭,
也可使用cose()显示关闭该连接。连接关闭后,将刷新缓冲区。

与文件的连接关闭后,并不会删除流,fstream流对象和它管理的缓冲区仍然存在,
可以将流重新连接到文件。

5.一个简单的读写文件示例

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
const string filename="test.txt";
int main()
{
ofstream fout(filename.c_str());
if(!fout.is_open())
{
cerr<<"无法打开文件 "<<filename<<endl;
exit(0);
}
cout<<"输入密码:";
float secret;
cin>>secret;
fout<<secret<<endl;
fout.close();

ifstream fin(filename.c_str());
if(!fin.is_open())
{
cerr<<"无法打开文件 "<<filename<<endl;
exit(0);
}
cout<<"输入的密码为:\n";
char ch;
while(fin.get(ch))
cout<<ch;
fin.close();
return 0;
}

程序中is_open()函数,是用来检查文件是否被打开
流对象的状态包括:
一切顺利,已达到文件尾,I/O操作失败等。如果一切顺利,流状态设置为0,否则设置为1。

6.打开多个文件
1)需要同时打开多个文件,则需要为每个文件创建一个流。
2)需要依次打开一组文件,可以只打开一个流,将它依次关联到各个文件。

如下例所示:

ifstream fin;
fin.open("test.txt");
fin.close();
fin.clear();
fin.open("test2.txt");
fin.close();

7.文件模式

常量 含义
ios_base::in 打开文件,以便读取
ios_base::out 打开文件,以便写入
ios_base::ate 打开文件,并移到文件尾,和ios_base::app的区别是,后者只能在文件尾写入,前者只是将写入指针初始化在文件尾
ios_base::app 追加到文件尾
ios_base::trunc 如果文件存在,则清空文件内容
ios_base::binary 二进制文件

对于ifstream open(),默认的模式为ios_base::in
对于ofstream open(),默认的模式为ios_base::out|ios_base::trunc,打开并清空文件

8.二进制模式 ios_base::binary 

文件的存储类型有两种,文本格式或二进制格式。
文本格式便于读取,而二进制格式更加精确,占用空间小,读取速度快。
写操作:

fout.write((char*)&T,sizeof T);

读操作:

fin.read((char*)&T,sizeof T);

注意需要将类型实例地址,强制转换为char*类型。

9.随机存取

随机存取是指,读写指针直接移动到文件的任何位置。

跳转函数:

istream & seekg(streamoff,ios_base::seekdir);//相对地址
istream & seekg(streampos);//绝对地址

第一个方法的意思是,离seekdir参数指定文件位置,距离streamoff的位置。
其中,streamoff单位的是字节,seekdir表示文件的三个位置(顶端ios_base::beg,底端ios_base::end,当前位置ios_base::cur)

第二个方法的意思是,离文件开头streampos的位置
streampos表示文件中的绝对位置,单位是字节

seekg()
移到文件开头

tellg()
返回读写指针当前的位置

下面,我们用二进制文件模式,写一个简单的随机存取示例:

#include<iostream>
#include<fstream>
#include<iomanip>
const int LIM=20;
struct planet
{
    char name[LIM];
    double population;
    double g;
};
const char *file = "planets.dat";
inline void eatline(){while(std::cin.get()!=‘\n‘) continue;}
int main()
{
    using namespace std;
    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<<"contents of file "<<file<<endl;
        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;
        }
        if(finout.eof())
            finout.clear();
        else{
            cerr<<"无法打开文件 "<<file<<endl;
            exit(0);
        }
    }
    else{
        cerr<<"无法打开文件 "<<file<<endl;
        exit(0);
    }
    cout<<"enter record number to change:";
    long rec;
    cin>>rec;
    eatline();
    if(rec<0||rec>=ct)
    {
        cerr<<"无效 index number"<<endl;
        exit(0);
    }
    streampos place = rec*sizeof pl;
    finout.seekg(place);
    if(finout.fail())
    {
        cerr<<"无法找到 index number"<<endl;
        exit(0);
    }
    finout.read((char *)&pl,sizeof pl);
    cout<<"找到的 index number"<<endl;
    cout<<rec<<":"<<setw(20)<<pl.name<<":"
                <<setprecision(0)<<setw(12)<<pl.population
                <<setprecision(2)<<setw(6)<<pl.g<<endl;
    if(finout.eof())
        finout.clear();
    cout<<"输入name:";
    cin.get(pl.name,LIM);
    eatline();
    cout<<"population:";
    cin>>pl.population;
    cout<<"g:";
    cin>>pl.g;
    finout.seekp(place);
    finout.write((char*)&pl,sizeof pl)<<flush;
    if(finout.fail())
    {
        cerr<<"写失败 index number"<<endl;
        exit(0);
    }

    ct = 0;
    finout.seekg(0);
    cout<<"contents of file "<<file<<endl;
    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;
    }
    finout.close();
    cout<<"Done.\n";
    return 0;
}

程序中,我们使用了一个特别的流管理对象fstream,
fstream继承子iostream,而iostream继承自istream和ostream
因此fstream继承了两个缓冲区,一个用于输入,一个用于输出
并能同步化两个缓冲区的处理。即输入指针和输出指针的位置始终相同。
这样用一个流管理对象,就可以同时进行读和写。

参考资料:《C++ Primer.Plus》 pp.768-788

时间: 2024-11-06 03:33:55

C++文件输入和输出的相关文章

【Java】字节流-从文件输入,输出到文件

假如需要复制一张图片,一份word,一个rar包.可以以字节流的方式,读取文件,然后输出到目标文件夹. 以复制一张4M的图片举例. 每次读一个字节: ch = (char)System.in.read(); //读入一个字符,返回读到的字节的int表示方式,读到末尾返回-1 复制时候一个字节一个字节的读取.写入,这样是很慢的.设置一个用来缓冲的字符数组,会让复制的过程快很多(每次读入的字节变多). 方便阅读,类的名称用中文描述 import java.io.*; public class 字节流

python文件输入和输出

1.1文件对象 文件只是连续的字节序列.数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成.1.2文件内建函数open()和file() 内建函数open()的基本语法是: file_object=open(file_name,access_mode='r',buffering=-1) file_name是包含要打开的文件名字的字符串,它可以是相对路径或者绝对路径. access_mode可选变量也是一个字符串,代表文件打开的模式. 'r'代表:读取: 'w'代表:写入: 'a'

python基本文件操作(文件输入和输出)

文件输入输出中常用的文件对象方法: open : 返回一个新的文件对象,调用该对象的上的方法可对文件进行任何操作 readline: 读取一行你给哦如果您包括结尾的换行符在内 write: 将数据写入文件中 close: 关闭文件对象:   举例:读取E盘中的work.txt文件 f = open('work.txt') line  =f.readline() print(line) f.close() 如果给readline设置一个参数 n 则读取n个字符 不设置 则只读取一行包括结尾的换行符

Java 输入/输出(I/O)学习笔记 -- 文件输入与输出

在保存数据时,可以选择二进制格式或文本格式.例如,整数 1234 存储成二进制数时,它被写为由字节 00 00 04 D2 构成的序列(十六进制表示法) ,而存储成文本格式时,它被存成了字符串" 1234" .尽管二进制格式的 I/O 高速且高效,但是不宜人来阅读. 读写文本数据 在存储文本字符串时,需要考虑字符编码(character encoding)方式.在 UTF-16 编码方式中,字符串" 1234"编码为 00 31 00 32 00 33 00 34

网易云课堂_C++程序设计入门(下)_第7单元:出入虽同趣,所向各有宜 – 文件输入和输出_第7单元 - 作业1:OJ编程

第7单元 - 作业1:OJ编程 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 本作业是第7单元作业系列. 本单元[多个作业]之间有[前后依赖关系]. 本单元作业应[按照次序]完成. 依照学术诚信条款,我保证此作业是本人独立完成的. 1 阅读所给的代码,理解代码的主要功能及原理 补充缺失代码 提交OJ判分(10分) 题目内容: 以单例模式创建一个屏幕Screen

Python之文件输入和输出

文件的打开方式 r        以只读方式打开 w        以写方式打开(必要时清空) a        以追加模式打开 r+        以读写方式打开 w+        以读写方式打开 a+        以读写方式打开 文件输入输出 方法                作用 read()      读取字节到字符串中,最多读取给定数目个字节 readline()    读取一行,包括行结束符,以字符串方式返回 readlines()    读取所有行,以列表方式返回 write

3.7.3 文件输入与输出

想要对文件进行读取,就需要一个File对象构造一个Scanner对象,如下所示: Scanner in = new Scanner(Paths.get("myfile.txt), "UTF-8"); 如果文件名中包含反斜杠符号,就要记住在每个反斜杠之前再加一个额外的反斜杠:"c:\\mydirectory\\myfile.txt" import java.io.IOException; import java.lang.Exception; import

C++ Primer Plus 第17章 输入,输出和文件

第17章 输入.输出和文件 1.当到达输入语句时,他将刷新输出缓冲区中当前所有的输出 2.streambuf类 提供了对缓冲区的各种操作 ios_base类表示流的一般特征 ios类基于ios_base,包含了一个指向streambuf对象的指针 ostream类从ios派生,提供可输出方法 istream类从ios派生,提供可输入方法 iostream类基于ostream和istream,继承了输入和输出方法 3.包含iostream则自动创建了8个流对象 cin 标准输入 wcin 宽字符流

文件输入/输出

fopen:打开文件.第一个参数文件名的字符串地址.打开模式:r:读 w:写,会改 没有就创建 a:追加 ,没有就创建 r+:读取和写入 w+:同上但会改 没有就创建a+:同上,但是追加 rb,wb,ab,ab+,a+b,wb+,w+b,ab+,a+b,使用二进制模式而不是文本模式打开,其他类似 getc():到达文件结尾时,会返回EOF putc() 与getchar().putchar类似但适用于文件 putc(ch,文件指针) fclose 关闭由指针fp指定的文件#include<std