C/C++文件操作之FILE
本文章主要介绍在C/C++中的文件操作,方便自己忘记的时候可以查阅及供他人借鉴,有不足之处望大家指出。
一、FILE的主要函数集
1、FILE* fopen(const char* filename,const char* mode);
功能:用以打开一个文件
参数:filename 表示打开的文件名,是包含完全路径的文件名
mode 表示文件的打开方式
返回值:一个关联文件的指针
mode 可以的取的模式如下:
"r" 以读的方式打开文件
"w"以写的方式打开文件,若文件存在则将文件中数据删除重新写入数据
"a"以写的方式打开文件,如果文件存在,则在文件数据末尾写入新的数据
"r+"以读写的方式打开文件
"w+"以读写的方式打开文件,若文件存在则将文件中数据删除重新写入数据
"a+"以读和插入的方式打开文件,如果文件存在,则在文件数据末尾插入新的数据
"t"以文本的模式打开文件
"b"以二进制的形式打开文件
"c“激活关联文件名的提交标记,当调用fflush和_flushall函数调用时,文件缓冲区的数据写入磁盘
"n"重新设置提交标记的为未提交标记
2、int fclose(FILE* stream);
功能:关闭打开的文件
参数:stream 表示用fopen函数打开文件返回的文件指针
返回值:关闭成功返回0,失败返回-1
3、size_t fread(void* buffer,size_t size,size_t count,FILE* stream);
功能:读取文件中的数据
参数:buffer 存储数据的缓冲区
size 读取数据单位的大小
count 读取的单位数量,即读取size的数量
stream 表示用fopen函数打开文件的返回文件指针
返回值:实际读取的单位数量
4、char* fgets(char* string,int n,FILE* stream);
功能:从文件中读取一个字符串
参数:string 存储读出的字符串
n 读出的字符的最大个数
stream 表示用fopen函数打开文件的返回文件指针
返回值:指向string的指针,若错误或到达文件末尾则返回EOF
5、size_t fwrite(const void* buffer, size_t size,size_t count,FILE* stream);
功能:向文件中写入数据
参数:buffer 准备写入数据的缓冲区
size 写入数据的单位大小
count 写入单位数据size的最大数量
stream 表示用fopen函数打开文件的返回文件指针
返回值:实际写入的单位数量
6、int fputs(const char* string,FILE* stream);
功能:向文件写入字符串
参数:string 要写入的字符串
stream 表示用fopen函数打开文件的返回文件指针
返回值:成功返回0,失败返回-1
7、int feof(FILE* stream);
功能:判断文件是否达到文件末尾
参数:stream 表示用fopen函数打开文件的返回文件指针
返回值:若文件指针到达文件末尾返回非0值,否则返回0
8、int fseek(FILE* stream,long offset,int origin);
功能:将文件指针设置到指定的位置
参数:stream 表示用fopen函数打开文件的返回文件指针
offset 相对于origin位置的偏移量
origin 初始位置,可以取值为SEEK_CUR表示当前位置,SEEK_END表示文件尾,SEEK_SET表示文件开始位置
C/C++文件操作之fstream
C/C++文件操作之fstream
1、void open(const char* filename,int mode,int access);
功能:打开文件
参数:filename需要打开的文件名,是包含完全路径的文件名
mode 打开文件的方式
access 打开文件的属性
默认方式时:mode为ios::in|ios::out,access为0
其中打开方式mode有以下几种:
ios::app 以追加的方式打开文件
ios::ate 文件打开后定位到文件尾,ios::app就包含有此属性
ios::binary 以二进制方式打开文件,默认时是以文本方式打开
ios::in 文件以输入方式打开(文件数据输入到内存)
ios::out 文件以输出方式打开(内存数据输入到文件)
ios::nocreate 不建立文件,在文件不存在时打开失败
ios::noreplace 不覆盖文件,在文件存在时打开失败
ios::trunc 如果文件存在,把文件长度设为0
其中文件属性access有以下取值:
0 普通文件,打开访问
1 只读文件
2 隐含文件
3 系统文件
2、void close();
功能:关闭文件
3、读写文件使用插入符(<<),析取符(>>);
(1)文本文件的读写:
用插入器(<<)向文件写入;用析取器(>>)从文件读出。
假设fileread是以输入方式打开,filewrite以输出打开。
filewrite<<"C++ Programming";//向文件写入字符串"C++ Programming"
chara;
fileread>>a;//从文件读取一个字符,即a = 'C'。
这种方式还有一种简单的格式化能力,具体的格式有以下一些
操纵符功能输入/输出
dec格式化为十进制数值数据输入和输出
endl输出一个换行符并刷新此流输出
ends输出一个空字符输出
hex格式化为十六进制数值数据输入和输出
oct格式化为八进制数值数据输入和输出
setpxecision(int p) 设置浮点数的精度位数输出
把123当作十六进制写入文件:filewrite<<hex<<123;
把3.1415926以5位精度写入文件:filewrite<<setpxecision(5)<<3.1415926。
(2)二进制文件的读写
①put()函数向流写入一个字符,其原型是ofstream &put(char ch);如filewrite.put('c');就是向文件写一个字符'c'。
②get()的3种常用的重载形式:
ifstream &get(char &ch);
功能:是从文件中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。
fileread.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。
int get();
功能:从文件中返回一个字符,如果到达文件尾,返回EOF;x=fileread.get();表示从文件中返回一个字符到x中。
ifstream &get(char *buf,int num,char delim='n');
功能:从文件中读取字符到由buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'\n'。
fileread.get(str,127,'A');//从文件中读取字符到字符串str,当遇到字符'A'或读取了127个字符时终止。
③读写数据块
read(unsigned char *buf,int num);
功能:从文件中读取 num 个字符到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;
write(const unsigned char *buf,int num);
功能:从buf 指向的缓存写入num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。
unsigned char str[]="C++ Programming";
int n[5];
ifstream in("xxx.xxx");
ofstream out("yyy.yyy");
out.write(str,strlen(str));//把字符串str全部写到yyy.yyy中
in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数.
in.close();
out.close();
4、int eof();
功能:检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。
5、文件定位
C++ I/O系统管理两个与一个文件相联系的指针。一个是写入指针,它说明写入操作在文件中的位置;另一个是读取指针,它下次读取操作的位置。每次执行写入或读取时,相应的指针自动变化。
istream &seekg(streamoff offset,seek_dir origin);
功能:定位读取位置
ostream &seekp(streamoff offset,seek_dir origin);
功能:定位写入位置
参数:offset所能取得的最大值
origin移动的基准位置
origin有以下值的
ios::beg: 文件开头
ios::cur: 文件当前位置
ios::end: 文件结尾
fileread.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节
filewrite.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节
C/C++文件操作之CFile
CFile是MFC文件类的基类,主要是在开发MFC应用程序时对文件操作比较方便。下面主要记录CFile类中常用的成员函数。
CFile是MFC文件类的基类,主要是在开发MFC应用程序时对文件操作比较方便。下面主要记录CFile类中常用的成员函数。
1、打开文件
(1)CFile(LPCTSTR lpszFileName,UINT nOpenFlags);//是CFile类的一个构造函数
功能:打开一个文件
参数:lpszFileName 文件路径,此路径可为相对的也可为绝对的路径。
nOpenFlags 文件打开方式
其中打开方式nOpenFlags有以下取值:
CFile::modeCreate 构造新文件,若文件存在则设文件长度为0
CFile::modeNoTruncate 与modeCreate组合使用所创建的文件已存在则其长度不变为0。
CFile::modeRead 以读的方式打开文件
CFile::modeReadWrite 以读写的方式打开文件
CFile::modeWrite 以写的方式打开文件
CFile::modeNoInherit 阻止文件被子进程继承
CFile::modeShareDenyNone 不禁止其它进程读或写访问CFile::modeDenyRead 禁止其它进程读此文件
CFile::modeDenyWrite 禁止其它进程写此文件
CFile::ShareExcelusive 以独占方式打开文件,禁止其它进程对其读写
CFile::shareCompat 在open函数里与CFile::ShareExcelusive一样
CFile::typeText 对回车换行设置特殊进程(只用在派生类)
CFile::typeBinary 设置二进制模式(只用在派生类)
使用如下:
CFile file("D:\\1.txt",CFile::modeRead|CFile::mode::Write);
(2)virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);
功能:打开文件
参数:lpszFileName 文件路径,此路径可为相对的也可为绝对的路径。
nOpenFlags 打开方式
pError 指向一个存在的文件异常对象,获取失败操作的状态。
返回值:打开成功返回TRUE,否则返回FLASE
使用如下:
CFile file;
File.open("D:\\1.txt",CFile::modeRead|CFile::modeWrite);//这里使用的参数pError的缺省值NULL;
2、关闭文件
virtual void Close( );
使用如下:
file.close();
3、写入/读出
(1)virtual UINT Read (void* lpBuf,UINT nCount);
功能:从文件中读取nCount个字节到lpBuf中
参数:lpBuf 用来读取数据的缓冲区
nCount 读取数据的最大字节数
返回值:实际读取的字节数
使用如下:
char lpBuf[128];
File.Read(lpBuf,100);//从文件中读取100个字节数到lpBuf中
(2)DWORD ReadHuge(void* lpBuffer,DWORD dwCount);
功能:读取超过64k字节数据到缓冲区中
参数:lpBufffer 用来读取数据的缓冲区
dwCount 读取数据的最大字节数
返回值:实际读取的字节数
用法与read一样
(3)virtual UINT Write(const void* lpBuf,UINT nCount);
功能:将缓冲区中的数据写入到文件中
参数:lpBuf 存放准备写入文件的数据缓冲区
nCount 写入文件的最大字节数
返回值:实际写入文件的字节数
使用如下:
char* lpBuf = "C++ Programming";
file.Write(lpBuf,sizeof(lpBuf));
(4)(DWORD WriteHuge(void* lpBuffer,DWORD dwCount);
功能:写入超过64k字节数据到文件中
参数:lpBufffer 用来存放准备写入数据的缓冲区
dwCount 写入数据的最大字节数
返回值:实际写入的字节数
用法与Write一样
4、定位文件
(1)virtual LONG Seek(LONG lOff,UINT nFrom);
功能:定位当前文件指针
参数:lOff 指针移动的字节数
nFrom 指针移动模式
移动模式有如下三种:
CFile::begin 从文件起始位置开始向后移动lOff个字节
CFile::current 从当前文件指针开始向后移动lOff个字节
CFile::end 从文件末尾开始向前移动lOff个字节(此时lOff应为负数)返回值:lOff合法,则Seek返回从文件开始起的新字节偏移量。否则值未定义并产生CFileException异常。
使用如下:
file.Seek(100,CFile::begin);//从文件起始位置向前移动100个字节
(2)void SeekToBegin();
功能:文件指针移到文件起始位置
使用如下:
file.SeekToBegin();
(3)void SeekToEnd();
功能:文件指针移到文件末尾
使用如下:
file.SeekToEnd();
(4)virtual DWORD GetLength( ) const;
功能:获取文件长度
返回值:文件的长度
使用如下:
DWORD Length;
Length = file.GetLength();
(5)virtual void SetLength(DWORD dwNewLen);
功能:设置文件长度
使用如下:
file.SetLength(1000);
5、文件路径
(1)virtual CString GetFilePath( )const;
功能:获取文件的完整路径
返回值:文件的完整路径
使用如下:
CString FilePath;
FilePath = file.GetFilePath();
(2)virtual void SetFilePath(LPCTSTR lpszNewName);
功能:设置文件的完整路径
使用如下:
file.SetFilePath("D:\\1.txt");
(3)virtual DWORD GetPosition ( )const;
功能:获取文件指针相对于起始位置的偏移量,经常与Seek一起用
返回值: 文件指针相对于起始位置的偏移量
(4)static void PASCAL Rename(LPCTSTR lpszOldName,LPCTSTR lpszNewName);
功能:改名指定文件
参数:lpszOldName 原文件完全路径
lpszNewName 新文件完全路径
使用如下:
file.Rename("D:\\1.txt","D:\\2.txt");
(5)static void PASCAL Remove(LPCTSTR lpszFileName);
功能:删除文件
参数:lpszFileName 需要删除的文件的相对路径或绝对路径
使用如下:
file.Remove("D:\\1.txt");
C/C++文件操作之CStdioFile
CStdioFile类继承了CFile类。不过CStdioFile不支持Duplicate,LockRange,和UnlockRange这三个CFile函数,下面主要介绍CStdioFile的几个特有的函数。
1、构造函数
CStdioFile( LPCTSTR lpszFileName, UINT nOpenFlags );
功能:打开一个文件
参数:lpszFileName 需要打开的文件路径,相对路径或绝对路径
nOpenFlags 文件打开方式
这里的打开方式nOpenFlags与CFile类中的一样
使用如下:
CStdioFile file("D:\\1.txt",CFile::modeRead|CFile::modeWrite);
2、写入/读取函数
(1)virtual LPTSTR ReadString( LPTSTR lpsz, UINT nMax );
功能:读取一行数据
参数:lpsz 存放读取数据的缓冲区
nMax 读取的最大字符数
返回值:如果文件有多行,则当文件没有读完时,返回NOT NULL,读到文件尾,返回NULL。
使用如下:
char buf[100];
file.ReadString(buf,87);
(2)BOOL ReadString(CString& str);
功能:读取一行数据
参数:str 存放读取数据的缓冲区
返回值:如果文件有多行,则当文件没有读完时,返回TRUE,读到文件尾,返回FALSE。
使用如下:
CString str;
file.ReadString(str);
(3)virtual void WriteString( LPCTSTR lpsz );
功能:向文件中写入一行数据
参数:lpsz 存放准备写入的数据的缓冲区
使用如下:
LPCTSTR str = "C++ Programming";
file.WriteString(str);