c++:文件操作1 文件的打开

在程序中,要使用一个文件,先要打开文件后才能读写,读写完后要关闭。创建一个新文件也要先执行打开(open)操作,然后才能往文件中写入数据。C++ 文件流类有相应的成员函数来实现打开、读、写、关闭等文件操作。

C++ 标准类库中有三个类可以用于文件操作,它们统称为文件流类。这三个类是:

  • ifstream:用于从文件中读取数据。
  • ofstream:用于向文件中写人数据。
  • fstream:既可用于从文件中读取数据,又可用于 向文件中写人数据。

使用这三个类时,程序中需要包含 fstream 头文件。 C++ 类库中的流类如下图所示。

ifstream 类和 fstream 类是从 istream 类派生而来的,因此 ifstream 类拥有 istream 类的全部成员函数。同样地,ofstream 和 fstream 类也拥有 ostream 类的全部成员函数。这三个类中有一些十分熟悉的成员函数可以使用,如operator <<、 operator >>、peek、ignore、getline、get 等。

----对文件操作

在对文件进行读写操作之前,先要打开文件。打开文件有以下两个目的:

  • 通过指定文件名,建立起文件和文件流对象的关联,以后要对文件进行操作时,就可以通过与之关联的流对象来进行。
  • 指明文件的使用方式。使用方式有只读、只写、既读又写、在文件末尾添加数据、以文本方式使用、以二进制方式使用等多种。

打开文件可以通过以下两种方式进行:

  • 调用流对象的 open 成员函数打开文件。
  • 定义文件流对象时,通过构造函数打开文件。

关闭文件时,调用文件流对象的 close 成员函数即可

------1.使用 open 函数打开文件

先看第一种文件打开方式。以 ifstream 类为例,该类有一个 open 成员函数,其他两个文件流类也有同样的 open 成员函数:

void open(const char* szFileName, int mode)

第一个参数是指向文件名的指针,第二个参数是文件的打开模式标记。

文件的打开模式标记代表了文件的使用方式,这些标记可以单独使用,也可以组合使用。如下列出了各种模式标记单独使用时的作用,以及常见的两种模式标记组合的作用。

文件打开模式标记
模式标记适用对象作用
ios::inifstream
fstream
打开文件用于读取数据。如果文件不存在,则打开出错。
ios::outofstream
fstream
打开文件用于写入数据。如果文件不存在,则新建该文件;如 果文件原来就存在,则打开时清除原来的内容。
ios::appofstream
fstream
打开文件,用于在其尾部添加数据。如果文件不存在,则新建该文件。
ios::ateifstream打开一个已有的文件,并将文件读指针指向文件末尾(读写指 的概念后面解释)。如果文件不存在,则打开出错。
ios:: truncofstream单独使用时与 ios:: out 相同。
ios::binaryifstream
ofstream
fstream
以二进制方式打开文件。若不指定此模式,则以文本模式打开。
ios::in | ios::outfstream打开已存在的文件,既可读取其内容,也可向其写入数据。文件刚打开时,原有内容保持不变。如果文件不存在,则打开出错。
ios::in | ios::outofstream打开已存在的文件,可以向其写入数据。文件刚打开时,原有内容保持不变。如果文件不存在,则打开出错。
ios::in | ios::out | ios::truncfstream打开文件,既可读取其内容,也可向其写入数据。如果文件本来就存在,则打开时清除原来的内容;如果文件不存在,则新建该文件。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ios::binary 可以和其他模式标记组合使用,例如:

  • ios::in | ios::binary表示用二进制模式,以读取的方式打开文件。
  • ios::out | ios::binary表示用二进制模式,以写入的方式打开文件。

文本方式与二进制方式打开文件的区别其实非常微小,

一般来说,如果处理的是文本文件,那么用文本方式打开会方便一些。但其实任何文件都可以以二进制方式打开来读写。

在流对象上执行 open 成员函数,给出文件名和打开模式,就可以打开文件。判断文件打开是否成功,可以看“对象名”这个表达式的值是否为 true,如果为 true,则表示文件打开成功。

//打开文件
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream inFile;          //流类ifstream 建立读取数据的文件流对象
    inFile.open("c:\\tmp\\test.txt", ios::in);   //调用流对象的 open 成员函数打开准备读取的
//文件。参数是文件名和打开模式                   
    if (inFile)  //判断流对象名的表达式,若果为真true,条件成立,则说明文件打开成功
        inFile.close();   //关闭文件时,调用文件流对象的 close 成员函数即可。 
    else
        cout << "test.txt doesn't exist" << endl;
    ofstream oFile;       //流类ofstream  建立写入数据的文件流对象
    oFile.open("test1.txt", ios::out);      //调用流对象的 open 成员函数打开准备写入数据的文
//件。参数是文件名和打开模式                   
    if (!oFile)  //判断流对象名的表达式,条件成立(PS:注意此处是!非),则说明文件打开出错
        cout << "error 1" << endl;
    else
        oFile.close();  //关闭文件时,调用文件流对象的 close 成员函数即可。
    oFile.open("tmp\\test2.txt", ios::out | ios::in);  //第二个参数打开模式是  打开已存在的
//文件,既可读取其内容,也可向其写入数据。文件刚打开时,原有内容保持不变。如果文件不存在,则打开
//出错。
    if (oFile)  //条件成立,则说明文件打开成功
        oFile.close();
    else
        cout << "error 2" << endl;
    fstream ioFile;    //流类fstream
    ioFile.open("..\\test3.txt", ios::out | ios::in | ios::trunc);//第二参数打开模式是   打
//开文件,既可读取其内容,也可向其写入数据。如果文件本来就存在,则打开时清除原来的内容;如果文件
//不存在,则新建该文件。
    if (!ioFile)
        cout << "error 3" << endl;
    else
        ioFile.close();
    return 0;
}

调用 open 成员函数时,给出的文件名可以是全路径的,如第 7 行的c:\\tmp\\test.txt, 指明文件在 c 盘的 tmp 文件夹中;也可以只给出文件名,如第 13 行的test1.txt,这种情况下程序会在当前文件夹(也就是可执行程序所在的文件夹)中寻找要打开的文件。
第 18 行的tmp\\test2.txt给出的是相对路径,说明 test2.txt 位于当前文件夹的 tmp 子文件夹中。第 24 行的..\\test3.txt也是相对路径,代表上一层文件夹,此时要到当前文件夹的上一层文件夹中查找 test3.txt。此外,..\\..\\test4.txt..\\tmp\\test4.txt等都是合法的带相对路径的文件名。 

-----2.使用流类的构造函数打开文件     (PS:不要忘记什么是构造函数啊!!!在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。)

定义流对象时,在构造函数中给出文件名和打开模式也可以打开文件。以 ifstream 类(PS不要忘记它的本质是一个类哦)为例,它有如下构造函数:

ifstream::ifstream (const char* szFileName, int mode = ios::in, int);

第一个参数是指向文件名的指针;第二个参数是打开文件的模式标记,默认值为ios::in; 第三个参数是整型的,也有默认值,一般极少使用。

在定义流对象时打开文件的示例程序如下(用流类的构造函数打开文件):

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream inFile("c:\\tmp\\test.txt", ios::in);  //流ifstream 直接使用定义流对象打开要读取数据的文
//件,不要流对象的类下的open()成员函数
    if (inFile)
        inFile.close();
    else
        cout << "test.txt doesn't exist" << endl;
    ofstream oFile("test1.txt", ios::out); //流ofstream 直接使用定义流对象打开要写入数据的文件,不要流对
//象的类下的open()成员函数
    if (!oFile)
        cout << "error 1";
    else
        oFile.close();
    fstream oFile2("tmp\\test2.txt", ios::out | ios::in);   //流fstream同上 此文件即可写入也可读取
    if (!oFile2)
        cout << "error 2";
    else
        oFile.close();
    return 0;
}

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用C语言中的open函数可以打开文件打开文件后可以进行读写等操作。open函数的原型如下: ```c #include <fcntl.h> int open(const char *pathname, int flags, mode_t mode); ``` 其中,pathname是要打开文件路径名,flags是打开文件的方式,mode是文件权限。具体参数说明如下: - pathname:文件路径名,可以是相对路径或绝对路径。 - flags:打开文件的方式,有以下几种取值: - O_RDONLY:只读方式打开文件。 - O_WRONLY:只写方式打开文件。 - O_RDWR:读写方式打开文件。 - O_CREAT:文件不存在时创建文件。 - O_TRUNC:打开文件时清空文件内容。 - O_APPEND:写文件时追加到文件末尾。 这些值可以用按位或运算符(|)组合使用,例如O_RDWR | O_CREAT表示读写方式打开文件,如果文件不存在则创建文件。 - mode:文件权限,当flags中包含O_CREAT时,需要指定文件权限。可以使用以下值: - S_IRUSR:用户可读。 - S_IWUSR:用户可写。 - S_IXUSR:用户可执行。 - S_IRGRP:组可读。 - S_IWGRP:组可写。 - S_IXGRP:组可执行。 - S_IROTH:其他人可读。 - S_IWOTH:其他人可写。 - S_IXOTH:其他人可执行。 这些值也可以用按位或运算符(|)组合使用,例如S_IRUSR | S_IWUSR表示用户可读可写。 下面是一个示例代码,演示如何使用open函数打开文件: ```c #include <stdio.h> #include <fcntl.h> int main() { int fd; char buf[1024]; int n; // 打开文件 fd = open("test.txt", O_RDONLY); if (fd < 0) { fprintf(stderr, "open file failed\n"); return -1; } // 读取文件内容 n = read(fd, buf, sizeof(buf)); if (n < 0) { fprintf(stderr, "read file failed\n"); close(fd); return -1; } // 输出文件内容 printf("file content:\n%s", buf); // 关闭文件 close(fd); return 0; } ``` 在这个示例中,我们打开一个名为test.txt的文件,并读取文件内容,最后关闭文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值