记得大一的时候,我们学校安排了C语言这门课,一开始,大家都很有兴趣,也很开心的在学习,这里面包括我,学习了前面几张,觉得理论知识可以了,但是向动手写几个小程序,发现,脑袋中没有那种写程序的思维,一团浆糊。然后就开始自暴自弃,课也没去上,书也不去看,再到后来。只求60万岁,多一分浪费,少一分累赘。现在想想以前的我,还是觉得太幼稚了,思想是那么的不成熟。不管自己曾经学得如何,我们不能放弃最初的目标。那就是把C学好。现在的我即将踏入嵌入式的工作旅途,处处都是用C,这个语言是多么的古老,但是也是多么的实用。而且,它可以直接操作硬件。这是其它语言无可比拟的。今天的这篇微博是我开通CSDN的开始,所以,我除了讲说下C的文件操作的常用的知识点外,文章里面还会包含我的一些感慨。希望各位读者可以见谅。
开篇开始,本应该是从C的基础讲起,但是,经过一段时间的调查发现,很多学校的老师在C的教学上,都只是安排了前6章的居多。这个我其实倒是可以理解,毕竟课程的时间有限,另外一方面是C的后面几章会比较难以理解,学生学起来也不容易。而最后面这一张文件操作则是后面几章偏难中的比较简单的一章,只要稍微懂得定义指针。基本上看起来,和理解起来就不会那么难了。下面我把我的阅读笔记贴上来(精华笔记)。
1.fopen()函数
原型:
FILE *fopen(const char *filename,const char *mode);
打开文件的模式有:
(1)“r”打开文本文件进行【读】操作
(2)“w”创建文本文件进行【写】操作
(3)“a”向文本文件进行【读】【写】操作(如果文件不存在,则打开失败)
(4)“r+”打开文本文件进行【读】【写】操作
(5)“w+”创建文本文件进行【读】【写】操作,(如果之前存在,则清空)
(6)“a+f”追加或创建文本文件进行【读】【写】操作
(1)[rb]:打开二进制文件进行读操作
(2)[wb]:创建二进制文件进行写操作
(3)[ab]:向二进制文件追加数据
(4)[r+b ]:打开二进制文件进行读/写操作
(5)[w+b]:创建二进制文件进行读/写操作
(6)[a+b ]:追加二进制文件进行读/写操作 例子:
FILE *FP;
if((fp=fopen("a.txt","r"))=NULL)
printf("打开错误");
2.fclose()函数
规定只能打开8个文件
关闭文件可以释放系统资源,并且能降低超出允许打开的文件个数的风险,同时将清除所有相应的缓冲区
原型:
int fclose(FILE *fp);
fcloseall()函数用于关闭所有打开的流
3.fputc()函数
原型:
int fputc(int ch,FILE *fp);
例子:
char ch;
ch=getchar();
if(fputc(ch,fp)==EOF)
printf("写入失败");
4.fgetc()函数
用于从使用fopen()以读的模式打开的文件中读取字符,fgetc()函数从输入流中当前位置返回下一个字符,并增加文件位置指示器若返回EOF,则表示达到文件末尾
原型:
int fgetc(FILE *fp);
例子:
ch=fgetc(fp);//从文件中读取字符
5.fputs()函数
fputs()用于向磁盘文件写入字符串,fgets()用于从磁盘文件读取字符串
fputs()函数将整个字符串写入指定的流中,返回EOF,表示写入错误
fgets()函数从指定的流中读取一个字符串,直到读到一个换行符或者已经读了字符串长度减1个字符,返回的地址实际上就是str
原型:
int fputs(const char *str,FILE *fp);
例子:
int n=fputs("ww",FILE *fp);
6.fgets()函数
7.fread()函数
fread()函数和fwrite()函数称为无格式读或写函数
用于从文件读取或者向文件写入整块的数据,最有价值的一个应用是读写用户自定义的数据类型,尤其是结构体
原型:
size_t fread(void *buffer,size_t num_bytes,size_t count,FILE *fp);
说明
(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
(2)size:要读写的字节数;
(3)count:要进行读写多少个size字节的数据项
(4)fp:文件型指针
返回值是读取对象的数目,若返回0表示到达文件结尾或者出现错误例子:
char str[30];
struct stu
{
int age;
char name[10];
};
int n=fread(str,sizeof(struct stu),5,fp);
8.fwrite()函数
原型:
size_t fwrite(void *buffer,sizie_t num_bytes,size_tcount,FILE *fp);
返回值是写入文件的对象的数目,若该值小于count,说明有错误(没写完或者错误)
char str[30];
struct stu
{
int age;
char name[10];
};
int n=fwrite(str,sizeof(struct stu),fp);
9.feof()函数
如果到达文件末尾,函数feof()返回true,否则将返回false(0)
在读取二进制数据时,使用该函数。
使用feof()要注意,如果文件指针后面没数字了的话,它认为文件指针所指的下一个位置才是文件的末尾,并把前一个数字返回,所以最后一个数字会被读2次
原型:
int feof(FILE *fp);
例子:
while(!feof(fp))
{
char ch=fgetc(fp);
printf("%c",ch);
}
10.ferror()函数
用于判断文件操作是否出错,由于每个操作都设置了出错条件,所以应在每个操作后立即调用ferror(),否则可能会遗漏错误
原型:
int ferror(FILE *FP);
返回值为true,则表示操作时出错
11.rewind()函数
将文件位置指示器置于文件开头,它将文件指针作为自己的参数,当文件以读写方式打开时,即可以读也可以写
例子:
rewind(fp);
12.remove()函数
用于删除指定文件
原型:
int remove(char *filename);
若删除成功则返回0,否则返回非0值。注意:要删除文件必须要fclose()文件之后才能删除。
例子:
if(remove("a.txt"))
printf("删除失败\n");
上面这些都是我们在C中常用的有关文件的操作函数。可能在某些方面写得并不是很理想,毕竟这是基于我自身的理解,而且不能保证每个字都是敲的准确无误的。
上面的相关函数理解了,记住了,那么接下来,我们可以开始敲个小程序。
我们就在C盘创建一个a.txt,往里面随便写点什么,再打印在控制台。试一试,效果出来了么。欢迎批评指正哦
#include<stdio.h>
main()
{
FILE *fp;
char ch = 'a',ch2;
int i = 3,i2;
char s[10] ;
if((fp=fopen("c:\\a.txt","w+"))==NULL) //打开文件
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
fprintf( fp, "%s%c", "hello", ch );
fprintf( fp, "%d\n", i );
rewind(fp);//把文件指针返回到开始处
fscanf( fp, "%s", s );
fscanf( fp, "%c", &ch2 );
fscanf( fp, "%d", &i2 );
printf( "%s\n", s ); //这里已经把所有这一行的内容读完了,后面2句读不到东西。所以最后还是用结构体表示,并用fread读
printf( "%c\n", ch2 );
printf("%d\n",i2);
fclose( fp );//用完文件指针后一定要记得关闭。
}