C/C++ 文件读写

一些用于读写文本文件和二进制文件的基本函数介绍。

打开 & 关闭文件

打开:

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

关闭:

int fclose ( FILE * stream );

操作模式

即上述fopen函数的mode参数:

类型 对应文件类型 读写方式 文件不存在时 文件存在时
r 文本文件 只读 返回NULL 读取
w 文本文件 只写 创建新文件 清空
a 文本文件 追加 创建新文件 追加
r+ 文本文件 读/写 返回NULL 读取
w+ 文本文件 读/写 创建新文件 清空
a+ 文本文件 读/写 创建新文件 追加/读取追加
rb 二进制文件 只读 返回NULL 读取
wb 二进制文件 只写 创建新文件 清空
ab 二进制文件 追加 创建新文件 追加
rb+ 二进制文件 读/写 返回NULL 读取
wb+ 二进制文件 读/写 创建新文件 清空
ab+ 二进制文件 读/写 创建新文件 追加/读取追加

举例

int main() {
FILE *fin = fopen("in_file.txt", "r");
FILE *fout = fopen("out_file.txt", "w");
fclose(fin);
fclose(fout);
return 0;
}

读写文本文件

对应于scanf:

int fscanf ( FILE * stream, const char * format, ... );

对应于printf:

int fprintf ( FILE * stream, const char * format, ... );

对应于gets:

char * fgets ( char * str, int num, FILE * stream );

对应于puts:

int fputs ( const char * str, FILE * stream );

若将stream参数设为stdinstdout,则它们的功能与scanfprintf等相同。

读写二进制文件

fread:从stream中读取countsize字节的元素,并存入ptr中。

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

fwrite:将ptr中的countsize字节的元素写入stream中。

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

举例

int a[10] = {};

int main() {
FILE *fin = fopen("test.dat", "rb");
fread(a, sizeof(int), 10, fin);
//read 10 integers from "test.dat"

FILE *fout = fopen("out.dat", "wb");
fwrite(a, sizeof(int), 10, fout);
//write 10 integers to "out.dat"
return 0;
}

二进制文件定位

fseek设置小文件指针定位

int fseek ( FILE * stream, long offset, int fromwhere);
  • offset为偏移量,正数表示正偏移,负数表示负偏移
  • origin设定从文件的哪里开始偏移,可以取值为:SEEK_CURSEEK_ENDSEEK_SET
    • SEEK_SET: 文件开头
    • SEEK_CUR: 当前位置
    • SEEK_END: 文件结尾
  • 成功设置后返回0,否则返回非0值
  • 仅可以设置小文件指针定位(文件字节数不超过INT_MAX

ftell获取小文件指针偏移量

long int ftell ( FILE * stream );
  • 返回值即为偏移量
  • 仅支持获取小文件指针定位

fsetpos设置大文件指针定位

int fsetpos ( FILE * stream, const fpos_t * pos );
  • pos为设置偏移量,需要传引用
  • 可以设置大文件指针定位(文件字节数超过INT_MAX

fgetpos获取大文件指针偏移量

int fgetpos ( FILE * stream, fpos_t * pos );
  • pos为获取到的偏移量,需要传引用
  • 可以获取大文件指针定位(文件字节数超过INT_MAX

一般来说,fsetposfgetpos配合使用,fseekftell配合使用。

修改文件大小

需要包括头文件windows.hio.h,所以该函数仅支持 Windows 平台。
fileno返回文件句柄,chsize根据句柄将文件大小修改为size个字节。

int fileno( FILE *stream );
int chsize( int handle, long size );

举例

int main() {
FILE *fout = fopen("test.dat", "wb");
chsize(fileno(fout), read_sum * sizeof(int));
fclose(fout);
return 0;
}