C/C++文件操作

第一种方法:
使用fstresm头文件(sream的子类):
一.打开文件
以“读/写”方式打开文件使用fstream;
以“读”方式打开文件使用ifstream;
以“写”方式打开文件使用ofstream;
打开文件的方式在类ios(是所有流失I/O类的基类)中定义,常用的值如下:
ios::app //以追加方式打开文件
ios::ate //文件打开后定位到文件尾,ios::app就包含有此属性
ios::binary //以二进制方式打开文件, 缺省的方式就是文本方式
ios::in //以输入方式打开文件
ios::out //以输出方式打开文件
ios::nocreate //不建立文件,当文件不存在时打开失败
ios::noreplace //不覆盖文件,所以打开文件时如果文件存在则打开失败
ios::trunc //如果文件存在,把文件长度设为0
可以使用“|(或)”把以上属性连接起来。

一个读取文本文件的例子:

#include<fstream>
#include<iostream>
using namespace std;
void main()
{
ifstream fout;
char ch;
fout.open("e:\\1.txt",ios::in)//以“读”方式打开文件,ios::in也可不用指定,默认就是。
fout.get(ch);
cout<<ch;//输出文件的第一个字符
cin.get();
}

二.移动指针
使用seekg可以使读指针定位到指定位置;
使用seekp可以使写指针定位到指定位置。
函数原型:
ostream& seekp( streampos pos );
ostream& seekp( streamoff off, ios::seek_dir dir );
istream& seekg( streampos pos );
istream& seekg( streamoff off, ios::seek_dir dir );
参数
pos:新的文件流指针位置值
off:需要偏移的值
dir:搜索的起始位置
dir参数用于对文件流指针的定位操作上,代表搜索的起始位置
使用上面代码的参数,例:
fout.seekg(5,ios::beg);//从文件起始位置向后偏移5个字符
第二个参数有如下:
ios::beg:文件流的起始位置
ios::cur:文件流的当前位置
ios::end:文件流的结束位置

tellg()、tellp()可以分别返回读指针、写指针的位置。
例:
cout<

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void main()
{
ifstream fin;
ofstream fout;
string finname="e:\\1.txt",foutname="e:\\2.txt";
fin.open(finname,ios::in);
fout.open(foutname,ios::out);

}

第二种方法:
使用FILE*,(需要加入头文件stdio.h):
例:

#include<iostream>
#include<stdio.h>
using namespace std;
void main()
{
FILE *fp;
fopen_s(&fp,"e:\\1.txt","r");//使文件指针指向“e:\\1.txt”
char ch;
ch=fgetc(fp);//读取一个字符到ch
cout<<ch<<endl;//输出ch
cin.get();
}

一. 打开文件
fopen_s()用来打开文件,在vs中使用,因为它比fopen更安全,打开文件成功则返回0.
函数原型:
errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );
pFile :指向用于接收打开文件的指针。
filename :要打开的文件。
mode:打开模式,有以下几种方法:
“rt”      只读打开一个文本文件,只允许读数据
“wt”      只写打开或建立一个文本文件,只允许写数据
“at”      追加打开一个文本文件,并在文件末尾写数据
“rb”      只读打开一个二进制文件,只允许读数据
“wb”       只写打开或建立一个二进制文件,只允许写数据
“ab”       追加打开一个二进制文件,并在文件末尾写数据
“rt+”      读写打开一个文本文件,允许读和写
“wt+”      读写打开或建立一个文本文件,允许读写
“at+”      读写打开一个文本文件,允许读,或在文件末追加数 据
“rb+”      读写打开一个二进制文件,允许读和写
“wb+”      读写打开或建立一个二进制文件,允许读和写
“ab+”      读写打开一个二进制文件,允许读,或在文件末追加数据
r(read): 读
w(write): 写
a(append): 追加
t(text): 文本文件,可省略不写
b(banary): 二进制文件
+: 读和写

用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。
用“w”打开的文件只能向该文件写入。 若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。
二. 读写文件
·字符读写函数 :fgetc和fputc
·字符串读写函数:fgets和fputs
·数据块读写函数:fread和fwrite
·格式化读写函数:fscanf和fprinf

1.fgetc()每次读取一个字符,例:ch=fgetc(fp);
fputc()每次写入一个字符。
2.fgets()读取指定长度字符,例:char ch[10];fgets(ch,10,fp);
第一个参数指定读取出的储存位置;
第二个参数指定读取的字符数,若设为n,则读取n-1个字符;
第三个参数指定被读取的文件。
fputs()是写函数,使用方法同上。
3.fread()读取数据块,函数原型:
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
buffer
用于接收数据的内存地址
size
要读的每个数据项的字节数,单位是字节
count
要读count个数据项,每个数据项size个字节.
stream
输入流
读取总字节数=buffer*size;

fwrite原型:
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
返回值:返回实际写入的数据块数目
(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;
(2)size:要写入内容的单字节数;
(3)count:要进行写入size字节的数据项的个数;
(4)stream:目标文件指针;
(5)返回实际写入的数据项个数count。
说明:写入到文件的哪里? 这个与文件的打开模式有关,如果是w+,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a+,则从文件的末尾开始添加,文件长度加大。

4.fcanf()
从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
原型:
int fscanf(FILE*stream, constchar*format, argument…);
FILE *stream:文件指针
char *format:格式字符串
基本参数:
%d:读入一个十进制整数.
%i :读入十进制,八进制,十六进制整数,与%d类似,但是在编译时通过数据前置或后置来区分进制,如加入”0x”则是十六进制,加入”0”则为八进制。例如串”031”使用%d时会被算作31,但是使用%i时会算作25.
%u:读入一个无符号十进制整数.
%f %F %g %G : 用来输入实数,可以用小数形式或指数形式输入.
%x %X: 读入十六进制整数.
%o’: 读入八进制整数.
%s : 读入一个字符串,遇空字符’\0’结束。
%c : 读入一个字符。无法读入空值。空格可以被读入。
例:fscanf(fp,”%s%d%lf”,a,&b,&c);

fprintf原型:
int fprintf (FILE* stream, const char*format, argument)
FILE*stream:文件指针
const char* format:输出格式
fprintf( )会根据参数format 字符串来转换并格式化数据, 然后将结果输出到参数stream 指定的文件中, 直到出现字符串结束(‘\0’)为止。

三.关闭文件
fclose()用来关闭文件;
函数原型:
int fclose( FILE *fp );
执行成功则返回0,否则返回EOF(-1)。
例:fclose(fp);//fp是打开文件的指针
四.检测文件结尾
int feof(FILE *fp);
feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为非零值,否则为0。
五.读写文件出错检测函数ferror函数
int ferror(FILE *stream);
在调用各种输入输出函数(如 putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。 它的一般调用形式为 ferror(fp);如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,对同一个文件 每一次调用输入输出函数,均产生一个新的ferror函 数值,因此,应当在调用一个输入输出函数后立即检 查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。

六.文件出错标志和文件结束标志置0函数clearerr函数调用格式: clearerr(文件指针);
功能:本函数用于清除出错标志和文件结束标志,使它们为0值。

猜你喜欢

转载自blog.csdn.net/lindorx/article/details/78756859