C/C++ 操作文件

oneNeko 于 2021-06-11 发布

使用C标准库读写文件

C读写文件的标准库函数包含于<stdio.h><cstdio>(C++)

打开文件

使用fopen来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型FILE的一个对象,类型FILE包含了所有用来控制流的必要的信息。

FILE *fopen(const char* filename, const char* mode);

mode的值如下:

模式 描述
r 打开一个已有的文本文件,允许读取
w 打开一个文本文件,允许写入。文件不存在则会创建一个新文件。如果文件存在,则该会被截断重新写入。
a 打开一个文本文件,以追加模式写入文件。文件不存在则会创建一个新文件。
r+ 打开一个文本文件,允许读写。
w+ 打开一个文本文件,允许读写。文件不存在则会创建一个新文件。如果文件存在,则该会被截断重新写入。
a+ 打开一个文本文件,允许读写。文件不存在则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

关闭文件

int fclose( FILE *fp );

如果成功关闭文件,fclose()函数返回零,如果关闭文件时发生错误,函数返回EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存

写入文件

fputc()把参数c的字符值写入到fp所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回EOF

int fputc( int c, FILE *fp );

fputs()把字符串s写入到fp所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回EOF:

int fputs( const char *s, FILE *fp );

fprintf把字符格式化写入到fp所指向的输出流中。

int fprintf(FILE *fp,const char *format, ...)

读取文件

fgetc()函数从fp所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回EOF

int fgetc( FILE * fp );

fgets()fp所指向的输入流中读取n-1个字符。它会把读取的字符串复制到缓冲区buf并在最后追加一个null字符来终止字符串。如果这个函数在读取最后一个字符之前就遇到一个换行符 ‘\n’ 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。

char *fgets( char *buf, int n, FILE *fp );

fscanf从文件中读取字符串,但是在遇到第一个空格和换行符时,它会停止读取。

int fscanf(FILE *fp, const char *format, ...)

二进制 I/O 函数

下面两个函数用于二进制输入和输出:

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
              
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

这两个函数都是用于存储块的读写 - 通常是数组或结构体。

使用C++标准库读写文件

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

使用这三个类时,程序中需要包含<fstream>头文件

打开或关闭文件

open()打开文件并与文件流对象相关联,结束使用时必须要用close()关闭文件,切断和文件流对象的关联。

void open(const char* szFileName, int mode);
void close();
is_open();  // 检查指定文件是否已打开。  
swap();     // 交换2个文件流对象。  
模式 作用
ios::in 打开文件用于读取数据。如果文件不存在,则打开出错。
ios::out 打开文件用于写入数据。如果文件不存在,则新建该文件;如果文件原来就存在,则打开时清除原来的内容。
ios::app 打开文件,用于在其尾部添加数据。如果文件不存在,则新建该文件。
ios::ate 打开一个已有的文件,并将文件读指针指向文件末尾。如果文件不存在,则打开出错。
ios::trunc 打开文件时会清空内部存储的所有数据,单独使用时与 ios::out 相同。
ios::binary 以二进制方式打开文件。若不指定此模式,则以文本模式打开。
ios::in | ios::out 打开已存在的文件,既可读取其内容,也可向其写入数据。文件刚打开时,原有内容保持不变。如果文件不存在,则打开出错。
ios::in | ios::out 打开已存在的文件,可以向其写入数据。文件刚打开时,原有内容保持不变。如果文件不存在,则打开出错。
ios::in | ios::out | ios::trunc 打开文件,既可读取其内容,也可向其写入数据。如果文件本来就存在,则打开时清除原来的内容;如果文件不存在,则新建该文件。

示例:

#include<fstream>
int main(){
   fstream fs;
   fs.open("test.txt",ios::in | ios::out | ios::app)
   fs.close();
   return 0;
}

读取或写入文件

标准库重载了运算符<<(输出)和>>(输入)实现文本模式读写

// 文本模式读写
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    string line;
    
    ofstream f_out("D:/test.txt", ios::out|ios::trunc); // 
    f_out << "hello fstream";
    f_out.close();

    ifstream f_in("D:/test.txt", ios::in); // 
    while (f_in >> line) {
        cout << line << endl;
    } 
    f_in.close();
   
    return 0;
}

二进制读写则使用下列函数,buffer用于指定要写入文件的二进制数据的起始位置;count用于指定写入字节的个数。

ostream & write(char* buffer, int count);
istream & read(char* buffer, int count);

参考

http://c.biancheng.net/cplus/60/