1.文件指针
FILE* fp=NULL;
- fp指针,只调用了fopen(),在堆区分配空间,把地址返回给fp
- fp指针不是指向文件,fp指针和文件关联,fp内部成员保存在文件的状态
- 操作fp指针,不能直接操作,必须通过文件库函数来操作fp指针
- 通过库函数操作fp指针,对文件的任何操作,fp里面成员会相应的变化(系统自动完成)
- FILE所有平台的名字都一样,FILE是一个结构体,里面的成员功能一样,不同平台成员的名字不一样
2.文件的操作
c语言中三个特殊的文件指针(无需定义可直接使用):stdin、stdout、stderr
3.文件的打开
文件的路径:
补充:在VS中,相对路径
a.编译同时直接运行程序,相对路径,相对于xxxx.vcxproj(项目文件)所在的路径
b.如果直接在Debug中直接运行程序,相对路径相对于可执行程序
在Qt中
a.编译同时直接运行程序,相对路径,相对于项目文件夹所对应的build中的debug所在的路径
b.如果直接在Debug中直接运行程序,相对路径相对于可执行程序
1 #include<stdio.h> 2 3 int main() 4 { 5 FILE*fp=NULL; 6 //打开成功,返回有效地址 7 //打开失败,返回NUULL 8 fp=fopen("./08txt","r");//文件不存在 9 if(fp==NULL) 10 { 11 perror("fopen"); 12 return 0; 13 } 14 fclose(fp); 15 fp=NULL; 16 return 0; 17 } 18
4.文件的写入
#include <stdio.h> int fputc(int ch, FILE * stream); 功能:将ch转换为unsigned char后写入stream指定的文件中,输入的字符最终转化为数字,每次写入一个字符 参数: ch:需要写入文件的字符 stream:文件指针 返回值: 成功:成功写入文件的字符 失败:返回-1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> int main() { FILE *fp; fp=fopen("08.txt","w"); if(fp==NULL) { perror("fopen"); return -1; } fputc('a',fp); fputc('b',fp); fputc('c',fp); fputc(97,fp); char ch='a'; while(ch<='z') { fputc(ch,fp); ch++; } char buf[]="zxcvbnm"; int n=strlen(buf); for(int i=0;i<n;i++) { fputc(buf[i],fp); } fclose(fp); fp=NULL; return 0; }
5.文件的读
#include <stdio.h> int fgetc(FILE * stream); 功能:从stream指定的文件中读取一个字符,每次读出一个字符,读完光标自动跳转到下一个字符前 参数: stream:文件指针 返回值: 成功:返回读取到的字符 失败:-1
文件末尾的判断
在C语言中,EOF表示文件结束符(end of file)。 在while循环中以EOF作为文件结束标志, 这种以EOF作为文件结束标志的文件,必须是文本文件。 在文本文件中,数据都是以字符的ASCII代码值的形式存放。 我们知道,ASCII代码值的范围是0~127,不可能出现-1, 因此可以用EOF作为文件结束标志。
if(ch==EOF)等价于if(ch==-1)
当把数据以二进制形式存放到文件中时,就会有-1值的出现,
因此不能采用EOF作为二进制文件的结束标志。
为解决这一个问题,ANSI C提供一个feof函数,用来判断文件是否结束。
feof函数既可用以判断二进制文件又可用以判断文本文件。
feof(fp);
- 如果第一次没有对文件进行读操作,直接调用此函数,永远返回假(文件没有到结尾)
- 此函数必须,先读,再调用feof()才有意义
- 调用此函数,光标不会自动往后移动
- 必须读取后,才能判断是否结束,判断的是读取的字符
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1#include<stdio.h> 2 #include<string.h> 3 4 int main() 5 { 6 FILE *fp; 7 fp=fopen("09.txt","w"); 8 if(fp==NULL) 9 { 10 perror("fopen"); 11 12 return -1; 13 } 14 char ch='a'; 15 while(ch<='z') 16 { 17 fputc(ch,fp); 18 ch++; 19 } 20 fclose(fp); 21 FILE *fp1=fopen("09.txt","r"); 22 char chr; 23 while(1) 24 { 25 chr=fgetc(fp1); 26 printf("chr=%d ",chr);//以字符形式输出 27 if(chr==-1) { 29 break; 30 } 31 } 32 fclose(fp1); 33 fp=NULL; 34 35 return 0; 36 }