int fclose(FILE *fp);
文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法为:
fp 为文件指针;
文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。
FILE * fopen (char * filename, char * mode);
#include<stdio.h>
filename 文件名称
mode 打开模式:
有:
r
只读方式打开一个文本文件
rb
只读方式打开一一个二 二进制文件
W
只写方式打开一一个文本文件
wb
只写方式打开一个二进制文件
a
追加方式打开一个文本文件
ab
追加方式打开一个二进制文件
r+
可读可写方式打开一个文本文件
rb+
可读可写方式打开- -个二 进制文件
w+
可读可写方式创建一个文本文件
wb+
可读可写方式生成一个二进制文件
a+
可读可写追加方式打开一个文本文件
ab+
可读可写方式追加一一个二进制文件
调用 fopen() 函数时必须指明读写权限,但是可以不指明读写方式(此时默认为"t")。
读写权限和读写方式可以组合使用,但是必须将读写方式放在读写权限的中间或者尾部(换句话说,不能将读写方式放在读写权限的开头)。例如:
将读写方式放在读写权限的末尾:"rb"、"wt"、"ab"、"r+b"、"w+t"、"a+t"
将读写方式放在读写权限的中间:"rb+"、"wt+"、"ab+"
整体来说,文件打开方式由 r、w、a、t、b、+ 六个字符拼成,各字符的含义是:
r(read):读
w(write):写
a(append):追加
t(text):文本文件
b(banary):二进制文件
+:读和写
关于 fread(); fwrite(); fseek();fgets();fgetc();feof();(ferror没写)
// FILE * fp; 必须命名 fp 为指向 FILE 的指针
FILE * fp = fopen("./clc.txt","w+"); // 注意一下,这里是指针,"w+" 必须加 " "
if(fp == NULL){
puts("fail to open file"); exit(-1); // 关于 exit() 其声明为:void exit(int status); 作用就是退出当前程序;
// status 指的是 程序退出时的状态码,一般 0 表示正常退出,其他表示非正常退出,一般都使用 -1;
}
/ size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。
ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size -- 这是要读取的每个元素的大小,以字节为单位。
nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
返回值:
返回成功读取的对象个数,若出现错误或到达文件末尾,若size或nmemb 为零,则fread返回零且不进行其他动作。
fread不区分文件尾和错误,因此调用者必须用feof和ferror才能判断发生了什么。
使用时,必须要注意:
char c[] = "This is runoob";
fread(buffer, strlen(c)+1, 1, fp); 这里是 strlen(C) + 1 要多出一个字节以存放 '\0'
另外,fread() 与 fwrite() 其实是一样的,都是从光标处开始写入/读取的,所以,要考虑清楚, fseek() 的使用
/ int fseek(FILE *stream, long int offset, int whence);
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset -- 这是相对 whence 的偏移量,以字节为单位。
whence -- 这是表示开始添加偏移 offset 的位置
关于 whence:
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾
你看,其实和 lseek(); 是一样的
/ size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr -- 这是指向要被写入的元素数组的指针。
size -- 这是要被写入的每个元素的大小,以字节为单位。
nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流(其实就是文件夹的地址)
返回值:
如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
注意哈,正常情况下,这里的 size_t 要与 nmemb 相同,
eg:
char str[] = "This is runoob.com";
int n_write = fwrite(str, sizeof(str) , 1, fp );
这里 n_write = 1;
int n_write = fwrite(str,sizeof(char),strlen(str),fp);
这里 n_write = strlen(str);
/ int feof(FILE *stream);
返回值:
当设置了与流关联的文件结束标识符时,该函数返回一个非零值,否则返回零。 // 其实就是说,当没有到达文件尾部的时候,返回值为 0;当到达文件末尾时,返回 非0
while(1)
{
c = fgetc(fp); // fgetc 与 fgets 唯一的区别是 c 只读一个字符,s 读一行字符
if( feof(fp) ) // if 语句,不为0 时,后面语句执行,为 0 时,后面语句不执行
{
break ;
}
printf("%c", c);
}
/ char * fgets(char *str, int n, FILE *stream);
从 stream 中读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止;
返回值是:如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,也返回一个空指针。
所以是每次只能取出一行,且当全部读取后,返回值为 NULL
使用时:
while( fgets(str, N, fp) != NULL ) {
printf("%s", str);
}
fclose(fp);