mylogo

退役程序员的茶室 RetiredCoder.cn

← 返回上一页

C++编程基础: 14. 文件的读写

2025-04-16 16:01:17

本系列文章是配合我发布的《C++编程基础》系列视频教程的知识点总结和补充。这一节我们来讲讲文件的读写。

文件的打开

在C++程序中,使用文件前要先“打开”文件,通过这个过程来让文件和程序中的文件流对象建立起联系。

在视频教程中,我们使用了标准库fstream中的两个类ofstream和ifstream的构造函数在定义文件流对象时就直接实现了文件的打开,另外还可以通过调用类中提供的方法open()来打开文件。

例如,在视频中的程序片段:

std::ofstream foutput("CPPLesson14.txt");

可以改写为如下片段:

std::ofstream foutput;
foutput.open("CPPLesson14.txt");

在视频中的程序片段:

std::ifstream finput("CPPLesson14.txt");

可以改写为如下片段:

std::ifstream finput;finput.open("CPPLesson14.txt");

文件的打开方式的设置

无论是使用构造函数还是open()方法来打开文件,跟在”路径+文件名”后面都可以跟第二个参数来设置文件的打开方式,这些方式种类包括:

打开方式 描述
ios::app 将写入内容追加到现有文件内容的尾部
ios::ate 打开文件后立即定位到文件末尾。
ios::in 打开文件用于读取。文件不存在时打开文件失败。
ios::out 打开文件用于写入。文件不存在时创建文件,文件已存在时覆盖原有文件内容。
ios::trunc 打开文件时即刻清除文件内容。
ios::binary 以二进制模式打开文件

例如,我们写入文件时原有的代码片段如下:

int numbers[]={13,14,17,42,49,22,46,37,19};
//std::ofstream foutput("CPPLesson14.txt");

std::ofstream foutput;
foutput.open("CPPLesson14.txt");
int arr_size=sizeof(numbers)/sizeof(numbers[0]);
for(int i=0;i<arr_size;i++){ 
    foutput<<numbers[i]<<"\n";
}
foutput.close();

在文本CPPLesson14.txt文件中的内容如下:

Image

这时如果我们修改原来的代码,设置它的打开方式为ios::app,改动如下:

int numbers[]={13,14,17,42,49,22,46,37,19};
//std::ofstream foutput("CPPLesson14.txt");

std::ofstream foutput;
foutput.open("CPPLesson14.txt",std::ios::app);
int arr_size=sizeof(numbers)/sizeof(numbers[0]);
for(int i=0;i<arr_size;i++){
    foutput<<numbers[i]<<"\n";
}
foutput.close();

此时文本CPPLesson14.txt中的内容,将会在原有文本的基础下扩展,其内容变为如下数据:

Image

另外,还可以通过OR运算符(“|”)将两种或两种以上的打开方式组合来使用,例如,可以直接使用标准库fstream里的fstream类来定义一个文件流对象,这个对象在做打开文件的操作时,可以给出ios::out|ios::in的打开方式参数,来限定文件的打开方式为可读可写,以我们视频课程的代码实现为例,修改后代码如下:

#include <iostream>
#include <fstream>
int main(int argc, const char * argv[]) {
    int numbers[]={13,14,17,42,49,22,46,37,19}; 
    //std::ofstream foutput("CPPLesson14.txt"); 
    std::fstream file;
    file.open("CPPLesson14.txt",std::ios::out|std::ios::in);
    int arr_size=sizeof(numbers)/sizeof(numbers[0]); 
    for(int i=0;i<arr_size;i++){ 
        file<<numbers[i]<<"\n"; 
    } 
    //foutput.close(); 
    //std::ifstream finput("CPPLesson14.txt"); 
    //std::ifstream finput; 
    //finput.open("CPPLesson14.txt"); 
    int sum=0, temp=0; 
    /*
    while(!finput.eof()){
        finput>>temp; 
        if(finput.fail()){ 
            break; 
        }
        sum+=temp; 
     } 
    */ 
    while(true){ 
        if(file>>temp){ 
            sum+=temp; 
        }else{ 
            break; 
        } 
    } 
    std::cout<<"The total:"<<sum<<std::endl; 
    file.close(); 
    return0;
}

使用具有可读可写权限的fstream类对象后,就不再需要单独定义输入文件流对象和输出文件流对象来分别实现读写功能了。

最后提醒一句,处理文件时小心覆盖有用的文件哦!