C++__文件读取与写入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingfengleerge/article/details/83857671

                                             文件读取与写入

一: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_SETSEEK_CURSEEK_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(总结十分到位)(感谢博主)

猜你喜欢

转载自blog.csdn.net/qingfengleerge/article/details/83857671