C中文件的输入输出与C++的文件流

C中文件输入输出

文件的缓冲区:

每一个被使用的文件都在内存中用一个FILE结构体来存储相应的文件信息(如文件的名字、文件的状态、文件当前位置等)。FILE的定义在stdio.h中

typedef struct
{
    short level; //缓冲区“满”的程度
    unsigned flags; //文件状态标志
    char fd;//文件描述符
    unsigned char hold;//如缓冲区无内容不读取字符
    short bsize;//缓冲区的大小
    unsigned char* buffer;//缓冲区位置
    unsigned char* curp;//指针当前的指向
    unsigned istemp; //临时文件指示器
    short token; //用于有效性检查
}FILE;
注:不同的编译器的FILE类型略有不同。例如,VC6.0中
struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;

一般使用文件类型指针,FILE* fp(注:它指向内存中的文件信息区(即FILE)的开头,而不是指向外部介质上的数据文件的开头)。
FILE* fp;
fp = fopen("test.txt","w");//以只写的方式打开文件
...
fclose(fp);//关闭文件

文件打开方式若指定文件不存在
"r"(只读)出错
"w"(只写)建立新文件,若文件存在,内容被销毁
"a"(追加)出错(自测VC6可以打开,新建一个空文件,应该编译器默认添加了w)
"rb"(二进制文件的只读)出错
"wb"(二进制文件的只读)建立新文件,若文件存在,内容被销毁
"ab"(二进制文件的追加)出错
"r+"(读写)出错
"w+"(读写)建立新文件,若文件存在,内容被销毁
"a+"(读写)出错(自测VC6可以打开,新建一个空文件,应该编译器默认添加了w)
"rb+"(二进制文件的读写)出错
"wb+"(二进制文件的读写)建立新文件,若文件存在,内容被销毁
"ab+"(二进制文件的读写)出错(自测VC6可以打开,新建一个空文件,应该编译器默认添加了w)

注:加b的表示对二进制文件操作,默认(不加b)对文本文件操作。a(append)表示在文件末尾写入。

常用下面的方法打开一个文件

if((fp=fopen("filename","r"))==NULL)
{
  printf("打开文件失败!");
  exit(0);    
}

 向文件读写的函数

fgetc(fp) 或 getc(fp)从fp指向的文件读入一个字符成功,返回读到的字符,失败返回文件结束标志EOF(即-1)
fput(ch, fp) 或 putc(ch, fp)把字符ch写到文件中去 成功,返回写入的字符,失败返回EOF
fgets(char* str, int n, FILE* fp)从文件读入一个长度为n-1的字符串,存到字符数组str中成功,返回str的地址,失败返回NULL
fput(char* str, FILE* fp)把字符串str写入文件中成功返回0,失败返回非0
fprintf(文件指针, 格式字符串, 输出列表)以格式化的方式写文件 
fscanf(文件指针, 格式字符串, 输入列表)以格式化的方式读文件 
fwrite(const void *, size_t, size_t, FILE *)向文件中写一个数据块 
fread(void *, size_t, size_t, FILE *)从文件中读一个数据块 

最最常用的是 fread 和 fwrite 函数,它们在读写时是以二进制的方式进行的,速度快。

fread(void *buffer, size_t size, size_t count, FILE * fp)
fwrite(const void *buffer, size_t size, size_t count, FILE *fp)
buffer 是一个地址
size:要读写的字节数
count:要读写多少个数据项(每个数据项的长度为size)
fp:文件指针  
成功返回count,失败返回小于 count 的整数,

注意:用”w+"打开时,用fwrite写入后就用fread读有点问题。不知为何?建议“w“和”r”分开读写。知道了原因:写入后文件位置标记(或称文件位置指针)是在文件的末尾,应该把标记定位到文件头再读文件。

  • 文件位置标记(文件位置指针)

文件位置标记是指“接下来要读写的下一个字符的位置”,它随文件的读或写向后移动。
改变文件标记的位置:
void rewind(FILE* fp):使文件标记指向文件开头。
int  fseek(FILE* fp, long offset, int origin); origin表示起始点,offset表示相对起始点的偏移量(正数向后偏移,负值向前偏移),成功返回0,失败返回非0值。
  origin可以取值0,1,2;0表示文件头位置,1表示当前位置,2表示文件末尾位置。
  #define SEEK_SET 0 //文件的开头位置
  #define SEEK_CUR 1
  #define SEEK_END 2
long ftell(FILE* fp); 获取文件文件位置标记的当前位置。是用相对于文件头的位移量来表示。成功返回位置,失败返回-1L。
feof(fp) 若标记到文件末尾,再读文件,该函数就返回1。否则返回0
还有一些文件读写的函数:
ferror(fp) 若文件的输入输出出错了,该函数返回非0值,未出错返回0。
clearerr(fp) 清空错误,使文件错误标志和文件结束标志置为0。当ferror函数为非0值后,应该调用clearerr函数,使ferror(fp)的值为0,以便下次检查。

 

 

FILE的知识:www.cnblogs.com/lxy2015/p/5302365.html

转载于:https://www.cnblogs.com/htj10/p/10728143.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值