目录
前面教程汇总
第一讲
第二讲
第三讲
第四讲
第五讲
第六讲
第七讲
第八讲
第九讲
第十讲
第十一讲
第十二讲
文件
前言
文件是当今计算机系统不可或缺的部分。文件用于存储程序,文档,数据,书信,表格,图形,照片,等其它种类的信息,作为程序员,必须会编写创建文件和从文件中读写数据。
什么是文件?
文件通常是指在磁盘或固态是的一段已经命名的缓冲区,例如我们经常使用的 stdio.h
和 iostream
就是一个文件,C语言将文件看成一段连续的字节,每个字节都可被单独读输,C提供了两种模式:文本模式和二进制模式。
如何打开文件和关闭文件
打开文件
在C语言和C++中我们一般利用 fopen
函数来打开文件,该函数声明在 <cstdio>
(C语言为 <stdio.h>
)库中。
调用该函数的一般形式:
FILE * fp;
fp = fopen(char *str1, "str2");
其中 str1
指向一个字符串,该字符串为该文件的文件名(即路径),第二个参数为C语言规定的模式字符串。
详情如下:
这里请注意,如果使用 w
模式打开一个现有文件,该文件的内容会被删除。
程序成功打开文件后,fopen
函数返回文件指针,其他 I/O
函数可以使用这个指针指定该文件,即上述代码中的fp,FILE是c语言的一种结构体,它的定义在<cstdio>
(C语言为 <stdio.h>
)库中。其中包含了缓冲区信息等,这里不多赘述。
若是我们打开文件失败,这里 fopen()
函数会返回一个空指针。
关闭文件
我们在对文件进行完操作之后,要关闭文件,防止文件内容被破坏,在c语言中我们一般用 fclose()
函数关闭文件,形式如下:
fclose(fp);
其中 fp
为文件指针,必要时会刷新缓冲区,当磁盘已满,移动硬盘被拔出或者出现 I/O
错误时文件会关闭失败,所以对于比较正式的程序我们应该检查文件是否关闭,当文件成功关闭时 fclose
函数返回0,否则返回 EOF
(这里 eof
为文件结尾)。
判断代码如下:
if (fclose(fp) != 0) {
printf("Error in closing file %s\n", str1);
}
文件的读写操作
输入输出字符
在C语言中我们利用 getc()
和 putc()
函数进行文件里字符的输入和输出,语法如下所示:
ch = getc(fp);
putc(ch, fp);
getc
函数是读取文件中的一个字符赋给 ch
。
putc
函数是将 ch
写入文件中。
输入输出字符串
在文件中我们要进行字符串的输入和输出可以利用 fgets
函数和 fputs
函数,语法如下所示:
fgets(buf, stlen, fp);
fgets
函数的第一个参数和 gets
函数相同表示存储输入的地址(如上述代码中的 buf
是一个 char
型数组的名称),第二个参数是一个整数,表示带输入字符串的大小,最后一个参数为文件指针。
fgets
函数读取输入直到第一个换行符的后面,或者读到文件的末尾—— EOF
,或者读取到 strlen - 1
个字符,然后 fgets
函数在末尾添加一个空字符使之成为一个字符串,故我们读取的字符串长度为字符数加上一个空字符。 注意,如果 fgets
函数在读到字符上限之前已经读完一行,它为将换行符放到空字符前面。fgets
在遇见 eof
即文件结尾时会返回 null
。
fputs(buf, fp)
fputs
函数的两个参数实际意义与 fgets
相同,它的作用是将字符串写入指定的文件中,其中由于fgets
函数会保留换行符,所以 fputs
函数不会像 puts
函数一样自动添加换行符。
格式化输入与输出
文件的格式化输入与输出函数为 fscanf
,fprintf
函数其工作方式与 scanf
,printf
类似。
语法如下所示:
fprintf(fp, "%s", str1);
fscanf(fp, "%d", &a);
文件读写移动操作
在我们对文件进行读取时,经常需要改变读取的位置,在C语言中有两个函数可以便于我们进行这种操作。
ftell
函数
用来取文件当前位置。其一般形式为:
long n;
n = ftell(fp);
它的返回值时一个长整型,表示当前的读写位置(从文件开始处到现在的字节数),调用正确返回当前读写位置,错误返回 -1L
。
fseek
函数
fseek
函数用来改变文件指针的当前位置。其一般形式为:
fseek(fp,offset,from);
offset
位移量,类型为 long
型,表示以 from
为起点移动的量相对值(字节数)。
from
移动的起始位置。
from
是一种模式,如下所示:
文件的应用——倒序打印文件中的字符
例如我们在文本中输入 hello world
,输出结果为:dlrow olleh
。
#include <cstdio>
#include <cstdlib>
#define SLEN 81
int main()
{
char file[SLEN];
char ch;
FILE *fp;
long count, last;
puts ("Enter the name of the file to be processed:");
scanf("%80s",file);
if ((fp = fopen(file, "r")) == NULL) { //以只读的方式打开文件
printf("不存在文件%s\n", file);
exit(1);
}
fseek(fp, 0L, SEEK_END); //定位到文件末尾
last = ftell(fp); //获得从文件开始到现在的字节数
for (count = 1L; count <= last; count++) {
fseek(fp, -count, SEEK_END); //回退
ch = getc(fp);
if (ch != 'EOF' && ch != 'r') {
putchar(ch);
}
}
printf("\n");
fclose(fp);
return 0;
}
至此,C++入门教程就已经全部结束了。如果想进一步学习,可以关注我,留意我接下来的文章合集“算法入门教程”。注意,算法入门教程是程序算法,可用于各种语言,但是我将在教程里面使用C语言作为程序样例。