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 打开文件的属性

默认方式时:modeios::in|ios::out,access0

其中打开方式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();

功能:文件中返回一个字符,如果到达文件尾,返回EOFx=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类中常用的成员函数。

CFileMFC文件类的基类,主要是在开发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不支持DuplicateLockRange,和UnlockRange这三个CFile函数,下面主要介绍CStdioFile的几个特有的函数。

1、构造函数

CStdioFile( LPCTSTR lpszFileName, UINT nOpenFlags );

功能:打开一个文件

参数:lpszFileName 需要打开的文件路径,相对路径或绝对路径

nOpenFlags 文件打开方式

这里的打开方式nOpenFlagsCFile类中的一样

使用如下:

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);