C语言回顾14-04-24

本文深入讲解C语言中的文件操作,包括文件指针的概念、fopen函数的使用及各种模式,如'r'、'w'、'a'等,以及文件的关闭、读写操作。介绍了fputs、fgets、fwrite、fread、fprintf、fscanf等函数的特点和使用方法,同时探讨了文件位置控制函数fseek、ftell和rewind的运用。

C语言回顾-文件操作


C语言中,术语流表示任意输入的源或任意输出的目的地。许多小型程序都是通过一个流获得全部的输入,并且通过另一个流写出全部的输出。

  1. 文件指针

    C程序中对流的访问是通过文件指针实现的,此指针的类型为FILE,当我们需要定义一个文件指针需要FILE *p,这样子的声明之后,p就是一个可以指向文件的指针,接下来我们给他赋值。

  2. 打开文件

    文件的打开就要用到fopen函数,他有两个参数,一个是文件的打开路径,一个是打开方式fopen(“打开路径”,“打开方式”)打开路径很好理解,我们在保存文件的时候一定会有一个保存路径,像这样:如果我们要打开这个文件,就要在第一个参数里写入这个路径,fopen函数就会通过这个路径找寻这个文件。

    然后我们要怎么打开呢?有特定的一套符号,或者是说两套,区别于你想要写入打开二进制文件还是文本文件:

    用于打开文件的模式字符串
    用于文本文件二进制文件效果
    "r""rb"打开文件用于读
    "w""wb"打开文件用于写(文件不需要存在)
    "a""ab"打开文件用于追加(文件不需要存在)
    "r+""r+b"或者"rb+"打开文件用于读和写,从文件头开始
    "w+""w+b"或者"wb+"用于打开文件用于读和写(如果文件存在就截去)
    "a+""a+b"或者"ab+"打开文件用于读和写(如果文件存在就追加)

     

     

     

     

     

     

     

     

    从上表我们可以得到不同的打开文件对数据的操作方式,不使用追加的写入,会覆盖掉文件原本的内容。而追加可以保留原本的内容,并且通常我们也将两个操作结合起来。比如我们定一个文件指针,用来追加刚才的那个文件,我们需要这样的代码:

  3. FILE *fp=fopen("C:\\AppData\\Roaming\\miniconfig","a");
    这里为了防止里面出现转义字符,\应当替换成\\或者使用//,这样fopen就会返回一个FILE指针并赋值给fp,如果打不开文件,fopen会返回NULL,这也是我们判断位家是否打开成功的标志。
  4. 关闭文件

    当我们打开了一个文件指针,使用结束后就和其他指针一样,应当释放掉这个指针,或者说关闭掉不再使用的文件。这里我们要用到fclose,他将关闭来自fopen的函数的调用,和free类似,fclose也只需要把指针传入,就可以关闭这个文件。比如我们想关掉上面的fp只需要:

    fclose(fp);
  5. 文件的输入输出

那么在我们打开了文件之后呢,我们要给里面写东西或者读出东西应该怎么办呢?C语言里有很多的输入输出函数,下面的代码用其中一个对fputs和fgets来实现对文件的读写。

#include<stdio.h>
#include<stdlib.h>
void main()
{
	FILE *fp = fopen("c:\\a.txt", "w");//这里我们定义一个指针用来指向这个文件。
	char s[] = "HelloWorld",b[20];//定义一个字符数组保存这段话
	fputs(s, fp);//把这个字符数组传递到这个文件指针所指的地方
	fclose(fp);//关闭文件
	FILE *pf=fopen("c:\\a.txt","r");
	fgets(b,11,pf);
	printf("%s",b);
	getchar();
}

我们可以打开这个文件看看结果;,可以看见,在这这个文件里写入了这段话(是不是我打上去的可以自己测试。这一对函数的作用是获取一行字符或者输入一行字符,那么我们怎么从文件里读出数据呢?,就要看下面这个pf指针,他的打开方式是读,那么就可以把里面的内容存入到内存里,比如我们使用fgets,他有三个参数,要存放的数据名,读取数据的大小,和读取的文件指针。我们试着从文件里读取出内容,存放到字符串b里,并打印出来看看:

他打印出了字符串s的数据,是从文件里读取出的,还有很多对这样的函数,他们之间很相似,也有一些区别,下面我们总结一下:

函数名称函数特点
fgets和fputs按行输入输出,结束于换行符

fwrite和fread

他按照数组进行输入输出,需要首地址,元素名等参数
fprintf和fscanf输入输出按照字符数组而不是流

这些特点很复杂,我们还是先学会使用,比如我们拿三种方法,把三个字符串写入文本中:

int main()
{
	FILE *fp = fopen("C:\\a.txt", "w");
	fputs("AAAAA", fp);//第一种我们使用fputs
	char b[] = "BBBBB", c []= "CCCCC";
	fwrite(b, 1, 5, fp);//第二种我们使用fwrite
	fprintf(fp, "%s", c);//然后我们再使用fprintf
	fclose(fp);
	getchar();
	return 0;
}

结果是怎么样的呢,当然是按效果打出了这几个字符串,具体需要注意这几个函数的参数,使用方法,还要分清函数之间的区别,然后我们再编程试试从文件里读出数据:

#include<stdio.h>
int main()
{
	FILE *fp = fopen("C:\\a.txt", "r");
	char a[6]="0", b[10], c[10];
	fread(a, 1,5, fp);
	fgets(b, 6, fp);
	fscanf(fp, "%s", c);
	fclose(fp);
	printf("%s\n%s\n%s", a, b, c);
	getchar();
	return 0;
}

这里我们需要注意,fread是按照字符数组的方式输出的,他和字符串不一样的地方在于它后面没有\0,所以我们在开始的时候给他加上,否则在格式化输出的时候会出现异常,现在我们来看看结果:很明显,打印出了文件里的内容。

接下来我们要介绍一些别的函数,不同于文件读写,而是关于文件位置的函数

打开文件时,会将文件位置设置在文件的起始处,在读写操作进行的时候,文件位置会推进,并且允许按照顺序贯穿整个文件。

  • fseek

这个函数有三个参数,第一个为文件指针,第三个参数是新位置,这个参数有三种:

SEEK_SET文件的起始处
SEEK_CUR当前位置
SEEK_END末尾处

 

第二个参数是个字节计数,这是个long int 型的,可以理解为移动的字节数。

  • ftell

函数以长整形返回当前文件位置,并且把错误码储存到errno,ftell可能会储存返回的值并且稍后将其提供给fseek函数调用,这也使返回前面的文件设置成为可能

  • rewind

​​​​​​​rewind函数会把文件位置设置在开头处,调用rewind几乎等价于fseek(fp,0l,SEEK-SET),两者的差异是rewind函数不返回值,但是会为fp清除错误提示器。

简单的文件操作就学习到这里了,剩下的就是灵活使用来解决问题了,后面我们会用一些例题来加深理解。


13 : 03

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值