由于c语言是直接处理内核的一种语言,同时作为可移植性极高的一种编程语言,所以在很多情况下我们可以使用c语言进行编程处理,相应的随着使用,对文件的使用也在所难免,这里主要讲一下我对文件处理和应用的理解
首先是了解文件,在文件处理的过程中首先最重要的的文件的路径,在日常使用的时候主要考虑的在window中断位置,但如果使用的是linux系统则需要考虑其文件的绝对路径和相对路径,这里扯远了,总之路径是一个十分重要的东西,需要在程序中书写正确的路径。
接下来是文件的类型,这里不进行强调,日常中使用的基本上都是使用文本文件
最后是文件名,这个可以在路径中找到相应的文件名,所以也不进行强调
那么已经了解文件的基础知识的基础上,可以向后更进一步的学习
在c语言中如何创建一个文件呢
这里可以使用和打开文件相同的操作使用fopen()函数,这个函数不需要使用额外的头文件,在使用的时候只需要使用正常的#include<stdio.h>即可
那么说到这里,就将其中的正常会使用的文件操作说一下。
fgetc()一般是为了获取一个文件中的所有字符,fclose()一般是使用其关闭文件
fopen(文件名,使用文件方式); //文件名是一个字符串,使用方式需要加双引号,
fegrtc(文件指针) //从指针所指向的文件中读入一个字符
fputc(ch,fp) //把字符变量ch写到fp所指向的文件中去
那么在这里可以使用其对文件中的信息进行操作了
假如说我在window下想要对一个文件进行输入操作,那么可以这种处理
#include <stdio.h>
int main()
{
FILE*p; //设置一个文件指针
char ch; //定义一个字符变量
if((p=fopen("test.txt","w"))==NULL) //打开一个叫test的文本文件,以只写的方式,当 出错时,即返回值为NULL时,输出错误信息
{
printf("ERROR");
exit(0); //关闭所有文件,终止正在执行的程序
}
for(;ch!='\n';) //输入ch知道输入空格。
{
scanf("%c",&ch);
fputc(ch,p); //将字符ch写入p所指向的文件
}
fclose(p);//关闭文件
}
这个是在网上找到的对文件的简单处理操作,但这个存在问题,比如在文件操作中,并不会出现一行将所有东西输入输出全部的情况,一般都会对其实行换行操作,那么注意十五行对换行操作有判断,所以在其输入的时候并不可以实现按行操作,这个时候最好的办法是按字节读取按字节输入
这个等会会说到。
还有一点需要注意,在这种情况下一般是会删除之前的所有信息,然后得到新输入的信息,那么想要对其中做到追加而不是复写的话最好是需要对其中第八行的w进行改动成为a即可,具体原因可以查看我上面的表格
这个时候对字符串的写入就结束了,那么可以做对文件的复制,这个操作也是很好理解的,一般需要做备份的时候可以使用这个进行处理,那么就需要上面说到的fegrtc()和fputc()这两个办法
具体他实现思路还是将其上一个文件中的字符串进行复制然后将其中的内容复制到另一个文件当中
那么处理起来就很容易
#include <stdio.h>
int main()
{
FILE*p1,*p2; //设置2个文件指针
char filename[30],filename1[30],ch; //设置2个字符数组用来输入文件名用
printf("请输入要复制的文件名\n");
gets(filename); //输入文件名
printf("请输入复制后的文件名:\n");
gets(filename1); //输入文件名
if((p1=fopen(filename,"rb"))==NULL) //打开被复制的文件
{
printf("ERROR");
exit(0);
}
if((p2=fopen(filename1,"wb"))==NULL) //写入要复制的文件名
{
printf("ERROR");
exit(0);
}
while(!feof(p1)) //用一个检查文件是否结束的函数来判断
{
ch=fgetc(p1); //读出每一个p1指向的文件中的字节,把ch写入到p2指向的文件中去,如果没有p2文件,则会建立一个以filename1字符数组命名的文件
fputc(ch,p2);
}
printf("复制成功");
fclose(p1); //用完之后,为了避免不必要的操作干扰读写,要关闭文件,即断掉文件指针与文件的联系
fclose(p2);
}
feof(文件指针) //当文件结束时返回非0值,当文件未结束时返回0
这个也可以进行文件的处理,注意到其未处理结束会返回0,但在处理结束会返回非0值,那么只需要在复制的时候使用while(!feof(fp))进行判断即可
因为刚刚已经说过原因,那么当我想要对一个文件更准确的读写时,最好的方法依然是二进制读写。
在二进制读写中最常用的还是以下的三个函数fopen(),fread(),fwrite()
那么有了上面的基础,面对这三个函数就很好理解了。
因为fopen()在上面已经讲过了,那么这里主要讲一下fread(),fwrite()这两个函数
fread()其中需要四个参数
先看一下定义的函数
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。 |
举个例子
#include<stdio.h>
#define nmemb 3
struct test
{
char name[20];
int size;
}s[nmemb];
main()
{
FILE * stream;
int i;
stream = fopen("bearst","r");
fread(s,sizeof(struct test),nmemb,stream);
fclose(stream);
for(i=0;i<nmemb;i++)
printf("name[%d]=%-20s:size[%d]=%d/n",i,s[i].name,i,s[i].size);
}
其返回值为
name[0]=Linux! size[0]=6
name[1]=FreeBSD! size[1]=8
name[2]=Windows2000 size[2]=11
注意这里的返回值不是固定的,具体应该和实际情况相关
fwrite()和其相似,定义函数中的参数是相同的
那么直接看实例即可
#include<stdio.h>
#define set_s (x,y) {strcoy(s[x].name,y);s[x].size=strlen(y);}
#define nmemb 3
struct test
{
char name[20];
int size;
}s[nmemb];
main()
{
FILE * stream;
set_s(0,"Linux!");
set_s(1,"FreeBSD!");
set_s(2,"Windows2000.");
stream=fopen("/tmp/fwrite","w");
fwrite(s,sizeof(struct test),nmemb,stream);
fclose(stream);
}