【C++知识点】文件操作(二)

简介: 【C++知识点】文件操作(二)
关闭文件

当 C++ 程序终止时,它会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件。但写程序时应该养成一个好习惯,在程序终止前关闭所有打开的文件

下面是 close() 函数的标准语法,close() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。

void close();
案例 - 写入

每次运行都会覆盖原来的内容:

#include <iostream>
#include <fstream> //1.头文件
using namespace std;
int main() 
{
    //2.创建流对象
    ofstream outf; 
    //3.打开文件
    outf.open("file.txt"); 
    //outf.open("file.txt",ios::out);
    //outf.open("file.txt",ios::app); //每次运行不会覆盖原来内容
    //4.写入内容
    outf << " 山村咏怀" << endl;
    outf << " 邵雍" << endl;
    outf << "一去二三里,烟村四五家。" << endl;
    outf << "亭台六七座,八九十枝花。" << endl;
    //5.关闭文件
    outf.close();
    return 0;
}
案例 - 读取
#include <iostream>
#include <fstream> //文件流的头文件 
using namespace std;
int main() 
{
    //char cf[100]; //字符数组
    string cf; //字符串
    ifstream infile;
    infile.open("file.txt",ios::in); //inf.open("file.txt");
    infile >> cf;
    infile.close();
    cout << cf;
    return 0;
}

在c++中使用ifstream读文件的时候会以空格为分隔符,遇到空格就不读取了。这时候可以调用get函数来读取内容。

#include <iostream>
#include <fstream> //文件流的头文件 
using namespace std;
int main() 
{
    char a
    ifstream infile; //定义ifstream类(输入文件流类)对象infile
    infile.open("file.txt"); //打开文件 使文件流与c++.txt文件建立关联
    while (!infile.eof()) 
    {
        infile.get(a); //依次获取文件中每个字符 并输出 
        cout << a;
    }
    infile.close();
    return 0;
}

其实读取方式分为很多种,每种方式效率不同:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
    ifstream ifs;
    ifs.open("file.txt", ios::in);
    //判断是否打开
    if (!ifs.is_open())
    {
        cout << "文件打开失败!" << endl;
        return 0;
    }
    //读数据
    //第一种:效率低,不建议使用
    /*char c;
    while ((c = ifs.get()) != EOF)
    {
      cout << c;
    }*/
    //第二种
    /*char buf[1024] = {0};
    while (ifs >> buf)
    {
      cout << buf << endl;
    }*/
    //第三种
    /*char buf[1024] = {0};
    while (ifs.getline(buf, sizeof(buf)))
    {
      cout << buf << endl;
    }*/
    //第四种
    string buf;
    while (getline(ifs,buf)) //getline函数需要#include <string>
    {
        cout<<buf<<endl;
    }
    ifs.close();
    return 0;
}

二进制文件读写

写文件

二进制写文件主要利用流对象调用成员函数 write()

函数原型:

ostream& write(const char*buffer,int len);

参数解释:字符指针buffer指向内存中的一段存储空间,len是读写的字节数

案例:

#include <iostream>
#include <fstream>
using namespace std;
class Student 
{
public:
    Student() {}
    Student(string name,int age) :name(name), age(age) {}
protected:
    string name;
    int age;
};
int main() 
{
    ofstream bof;
    Student s1("张三", 100);
    bof.open("student.txt", ios::out|ios::binary);
    bof.write((const char*) & s1, sizeof(Student));
    bof.close();
    return 0;
}
读文件

二进制读文件主要利用流对象调用成员函数 read()

函数原型:

istream& read( char*buffer,int len);

参数解释:字符指针buffer指向内存中的一段存储空间,len是读写的字节数

案例:

ifstream bif;
bif.open("student.txt", ios::in | ios::binary);
if (!bif.is_open()) 
{
    cout << "文件打开失败" << endl;
    return 0;
}
Student s2;
bif.read((char*)&s2, sizeof(Student));
cout << s2.name << " " << s2.age << endl;
bif.close();

fstream文件操作

ifstream支持>>操作,ofstream支持<<操作,fstream同时支持>>和<<操作。

打开文件 fstream可以在声明流对象时传入文件名打开文件,也可以使用open()函数打开文件。

关闭文件 文件打开后必须关闭,fstream提供close()函数关闭文件。

打开文件

使用构造函数声明对象时打开文件,示例:

fstream file(filename, ios::in | ios::out);

使用open()函数打开文件,函数原型:

void open(const char* filename,int mode,int access);

如果只传入文件名,系统会自动根据文件类型选择默认的打开模式。

打开文件模式mode如图:

模式和属性可以单独使用,也可以混合使用。混合使用时,用逻辑连接符或 |连接。

ios::out模式默认会清空,即ios::out|ios::trunc和ios::out打开文件时都会清空文件。

如果不想清空文件,那么设置读写模式为ios::out|ios::app,以这种模式打开文件后,数据会以追加的方式写入到文件。

读写文件

fstream提供的读写操作有:<<、>>、read()、write()、put()、get()、getline()。根据文件类型可分为文本文件和二进制文件,根据读写方式可分为逐行读写和整块读写。通常,文本文件使用逐行读写的方式,二进制文件使用整块读写的方式。

  1. 1.文本文件读写
    逐行写入文本文件可以使用操作符====<<。
    逐行读取文本文件时可以使用==getline()==函数。
  2. 2.二进制文件的读写
    二进制文件通常整块读取或写入,当然也可以读写单个字符,用到的函数包括:put()、get()、read()、write()。
    通常使用write()、put()函数写入二进制文件。使用read()、get()读取二进制文件。

案例

#include <iostream>
#include <fstream> //1.包含头文件
#include <string>
using namespace std;
int main() 
{
    string str;
    fstream iofile; //2.创建对象
    iofile.open("file.txt",ios::out|ios::in|ios::trunc); //3.打开文件
    iofile << "这里是写入内容测试" << endl; //4.写入数据
    iofile << "this is test" << endl;
    iofile.close(); //5.关闭文件
    cout << "写入完毕" << endl;
    iofile.open("file.txt", ios::out | ios::in);
    while (getline(iofile,str)) //循环读取
    {
        cout << str << endl;
    }
    iofile.close();
    cout << "读取完毕" << endl;
    return 0;
}

文件定位和大小

C++的文件定位分为读位置和写位置的定位,对应的成员函数分别为seekg()和seekp()。seekg()函数设置读位置,seekp()设置写位置。函数原型如下:

istream& seekg(streamoff offset,seek_dir origin);   
ofstream& seekp(streamoff offset,seek_dir origin);

1.png

示例:

inFile.seekg(2,ios::beg); // 把文件读指针从开始位置向后移动2个字节
outFile.seekp(2,ios::cur); // 把文件写指针从当前位置向后移动2个字节

获取文件大小可以使用seekg()和tellg()或者seekp()和tellp()函数结合使用的方式获取文件大小。

示例:

inFile.seekg(0,ios::end); // 读文件指针移动到文件末尾
streampos ipos = inFile.tellg(); //返回当前指针的位置,也就是文件的大小,单位是字节

由此,我们可以对文件大小进行计算:

#include <iostream>
#include <fstream>
using namespace std;
int main(){ 
    long start, end; 
    ifstream ifile; 
    ifile.open("test.txt", ios::in | ios::binary); 
    start = ifile.tellg(); 
    ifile.seekg(0, ios::end);
    end = ifile.tellg(); 
    ifile.close(); 
    cout << (end - start) << " bytes.\n"; //文件字节大小 
    return 0;
}
目录
相关文章
|
6月前
|
安全 算法 程序员
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
【C/C++ 文件操作】深入理解C语言中的文件锁定机制
201 0
|
6月前
|
存储 人工智能 算法
【一站式备考指南】一文掌握 C++ 程序设计 课程 知识点
【一站式备考指南】一文掌握 C++ 程序设计 课程 知识点
128 0
|
6月前
|
C++ iOS开发
C++ 文件操作的技术性文章
C++ 文件操作的技术性文章
31 0
|
5月前
|
存储 网络协议 编译器
【干货总结】Linux C/C++面试知识点
Linux C/C++基础与进阶知识点,不仅用于面试,平时开发也用得上!
590 13
|
5月前
|
存储 C++
C++文件操作
C++文件操作
|
6月前
|
存储 C语言 数据安全/隐私保护
C++中的文件操作技术详解
C++中的文件操作技术详解
|
5月前
|
C++
C++继承的相关知识点
C++继承的相关知识点
28 0
|
6月前
|
C++
【C++小小知识点】重载、覆盖(重写)、隐藏(重定义)的对比【详解】(23)
【C++小小知识点】重载、覆盖(重写)、隐藏(重定义)的对比【详解】(23)
|
6月前
|
C++
C++语言学习文件操作应用案例
C++文件操作示例:创建`ofstream`对象写入&quot;Hello, World!&quot;到`output.txt`,刷新缓冲区,然后使用`ifstream`读取并打印文件内容。如果文件打开失败,程序将显示错误信息并返回1。
36 3