C语言回顾-文件操作
C语言中,术语流表示任意输入的源或任意输出的目的地。许多小型程序都是通过一个流获得全部的输入,并且通过另一个流写出全部的输出。
- 文件指针
C程序中对流的访问是通过文件指针实现的,此指针的类型为FILE,当我们需要定义一个文件指针需要FILE *p,这样子的声明之后,p就是一个可以指向文件的指针,接下来我们给他赋值。
- 打开文件
文件的打开就要用到fopen函数,他有两个参数,一个是文件的打开路径,一个是打开方式fopen(“打开路径”,“打开方式”)打开路径很好理解,我们在保存文件的时候一定会有一个保存路径,像这样:
如果我们要打开这个文件,就要在第一个参数里写入这个路径,fopen函数就会通过这个路径找寻这个文件。
然后我们要怎么打开呢?有特定的一套符号,或者是说两套,区别于你想要写入打开二进制文件还是文本文件:
用于打开文件的模式字符串 用于文本文件 二进制文件 效果 "r" "rb" 打开文件用于读 "w" "wb" 打开文件用于写(文件不需要存在) "a" "ab" 打开文件用于追加(文件不需要存在) "r+" "r+b"或者"rb+" 打开文件用于读和写,从文件头开始 "w+" "w+b"或者"wb+" 用于打开文件用于读和写(如果文件存在就截去) "a+" "a+b"或者"ab+" 打开文件用于读和写(如果文件存在就追加) 从上表我们可以得到不同的打开文件对数据的操作方式,不使用追加的写入,会覆盖掉文件原本的内容。而追加可以保留原本的内容,并且通常我们也将两个操作结合起来。比如我们定一个文件指针,用来追加刚才的那个文件,我们需要这样的代码:
-
FILE *fp=fopen("C:\\AppData\\Roaming\\miniconfig","a");
- 关闭文件
当我们打开了一个文件指针,使用结束后就和其他指针一样,应当释放掉这个指针,或者说关闭掉不再使用的文件。这里我们要用到fclose,他将关闭来自fopen的函数的调用,和free类似,fclose也只需要把指针传入,就可以关闭这个文件。比如我们想关掉上面的fp只需要:
fclose(fp);
- 文件的输入输出
那么在我们打开了文件之后呢,我们要给里面写东西或者读出东西应该怎么办呢?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