ANSI C提供了 文件的2种视图:
文本视图和二进制视图
二进制视图中,文本中的每个字节都可以为程序所访问 。在文本视图中,程序看到的内容和文本内容可能会有差异,差异主要体现在换行表现上 。使用文本试图读取文件时,将行尾的本地表示法转换成c试图的,在输出的时候,还要将c试图的行尾表示转换成本地的行尾表示法 。在msdos下 ,\r\n表示行尾。
二进制视图:文本的本地表现。
文本视图:文本行尾的本地表现转换成c视图后的表现。
在unix中二进制和文本没有差别。
标准文件:c程序自动打开3个文件,标准输入、标准输出、和标准错误输出
fopen()函数 :第一个参数是要打开的文件名(包含该文件名的字符串的地址),第二个参数用于指定文件打开模式的一个字符串
模式字符串 | 意义 |
"r" | 打开一个文件,可以读取文件 |
"w" | 打开一个文件,可以写入文件,先将文件的长度截取为0.如果文件不存在的话则先创建文件 |
"a" | 打开一个文件,可以写入文件,向已有文件的尾部追加内容,如果文件不存在的话就先创建文件 |
"r+" | 打开一个文件,可以进行更新,即可以读取和写入 |
"w+" | 打开一个文件,可以读取和写入文件,先将文件的长度截取为0.如果文件不存在的话则先创建文件 |
"a+" | 打开一个文件,可以读取和写入文件,向已有文件的尾部追加内容,如果文件不存在的话就先创建文件 |
上述模式后加上b | 表示二进制而不是文本模式 |
对于unix和linux中文件模式只有一种,所以无所谓+b还是不加b,但是其中的w模式打开一个已有文件的话,文件的内容会被删除,以便程序以一个空文件开始操作。
程序成功打开一个文件之后,fopen()函数会返回一个文件指针,然后利用这个指针对文件进行其他操作。文件指针是一种指向FILE的指针,它不指向实际的文件,而是指向一个关于文件的信息的数据包。
如果打开不成功,fopen()函数返回空指针 Null
fprintf()和fscanf():工作方式和 printf()和scanf()类似,区别在于前2者须呀第一个参数来指定合适的文件int main()
{ const int max=40; FILE *fp; char words[max]; if((fp=fopen("words","a+"))==NULL) { fprintf(stdout,"canopen file\n"); exit(1); } puts("Enter words to add to the file: press the enter"); puts("key at the beginning of a line to terminate"); while(gets(words)!=NULL&&words[0]!='\0') { fprintf(fp,"%s",words); } puts("file contens:\n"); rewind(fp); while(fscanf(fp,"%s",words)==1) { puts(words); } if(fclose(fp)!=0) { fprintf(stderr,"error in closing\n"); } return 0; }
rewind()函数接受一个文件指针,然后指向文件的开头。
fgets()和fputs()函数
fgets()函数 接受三个参数:第一个参数,用来存储输入的地址(char *类型),第二个参数是整数 用来保存输入字符串的最大长度;最后一个参数是文件指针,指向所有读取的文件。
fgets(buf,MAX,fp);
buf是一个char数组的名称,MAX是字符串最大长度,fp是一个指向FILE的指针。该函数读取的哦啊他所遇到的第一个换行字符的后面,或者读取比字符串最大长度少一个的字符,或者是文件的末尾。容纳后fgets自己添加空字符以构成一个字符串 。
随机存取 : fseek()和ftell()函数
fseek()函数有点类似数组 ,随即存取,在 fopen()打开的文件中直接移动到任意字节处 。
ftell()函数以一个long类型值返回文件的当前位置。