文件读取与写入
一:C中文件的读取与写入操作
定义于头文件<stdio.h>中
⑴文件存取
重点函数:fopen——打开文件;fclose——关闭文件
①fopen函数原型:FILE* fopen(const char* filename,const char* mode);
参数详解:
filename——将文件流关联到的文件名
mode——以空字符结尾的字符串,用以确认文件存取模式
②fclose函数原型:int fclose(FILE* stream);
关闭给定的文件流。任何未写入的缓冲数据都会被刷新到操作系统。任何未读缓冲数据都将被丢弃。
⑵直接输入/输出
重点函数:fread——从文件中读取;fwrite——写入文件
①fread函数原型:size_t fread(void* buffer,size_t size,size_t count,FILE* stream);
参数详解:
buffer——指向存储读取对象的数组的指针
size——每个对象的大小(以字节为单位)
count——要读取对象的数量
stream——读取的文件流
②fwrite函数原型:size_t fwrite(const void* buffer,size_t size,size_t count,FILE* stream);
参数详解:
buffer——指向数组中要写入的第一个对象的指针
size——每一个对象的大小
count——要写入的对象的数量
stream——指向输出流的指针
⑶文件定位
重点函数:ftell——返回当前文件位置指示器;fseek——将文件位置指示器移动到文件的指定位置(移动文件流的读写位置)。
①ftell函数原型:long ftell(FILE* stream);
返回文件流的文件位置指示器。
如果流以二进制模式打开,这个函数得到的值是文件开头的字节数。
如果流以文本模式打开,则此函数返回的值是未指定的,并且仅作为fseek()的输入有意义。
②fseek函数原型:int fseek(FILE* stream,long offset,int origin);
参数详解:
stream——要修改的文件流
offset——相对于原点移动位置的字符数
origin——添加偏移量的位置。它可以有以下值之一:SEEK_SET、SEEK_CUR、SEEK_END
参数offset 为根据参数origin来移动读写位置的位移数。参数 origin为下列其中一种:
SEEK_SET 从距文件开头offset 位移量为新的读写位置. SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当origin 值为SEEK_CUR 或
SEEK_END 时, 参数offset 允许负值的出现.
下面是较特别的使用方式:
1) 欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
2) 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, 0SEEK_END);
返回值:当调用成功时则返回0, 若有错误则返回-1, errno 会存放错误代码.
附加说明:fseek()不像lseek()会返回读写位置, 因此必须使用ftell()来取得目前读写的位置.
⑷使用范例:
//以二进制的方式读取出文本文件存到vector容器中。
#include <cstdio>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
static size_t GetFileSize(FILE* file)
{
fseek(file,0,SEEK_END);
size_t read_len=ftell(file);
fseek(file,0,SEEK_SET);
return read_len;
}
static size_t GetFileSize(const char* file_path)
{
FILE* file=fopen(file_path,"rb");
if(file==nullptr) {
return 0;
}
size_t size=GetFileSize(file);
fclose(file);
return size;
}
//调用该函数即可以二进制的形式读取出文件字节存储到vector容器中。
std::vector<unsigned char> ReadFromFile(const char* file_path) {
FILE* file=fopen(file_path,"rb");
std::vector<unsigned char> result;
if(file==nullptr) {
return result;
}
//获取文件大小,尽量一次读完
size_t file_size=GetFileSize(file);
if(file_size!=0) {
result.resize(file_size);
size_t n=fread(&result[0],1,file_size,file);
assert(n<=file_size);
if(n!=file_size) {
result.resize(n);
}
}
//在读取过程中,有可能文件大小有变化,再尝试读取。
const size_t read_len=1024;
char buf[read_len];
for(;;) {
size_t n=fread(buf,1,read_len,file);
result.insert(result.end(),buf,buf+n);
if(n<read_len) {
break;
}
}
fclose(file);
return result;
}
二:C++中文件的读取与写入操作
请参考博主 追求执着的博文https://blog.csdn.net/kingstar158/article/details/6859379(总结十分到位)(感谢博主)