第六章 文件操作
前言:第五章是C语言在数学上的一些应用,我觉得没有必要,便跳过了。这章正如我标题所写的,是C语言在文件上的操作。学习了这个后,你们可以自行编辑一些所需的快捷程序,来实现一些既定的目的,完成一些重复操作。
PS:本文中例子皆采用了相对路径,请注意路径问题。
6.1 文件读写操作
PS:首先确立一个概念,C语言中的“文件”只是一个逻辑概念,可以用来表示从磁盘文件到终端等所有东西,就如同DOS一样的。在这一节中,我们要先学会对磁盘文件进行打开或读写操作的几种不同方法,然后就可以根据不同情况来选择最为恰当的操作方式。
实例167 读取磁盘文件
问题:编程实现读取某一相对下文本文档内容。(事先放入一个文本内容为“hello world hello master”。)
逻辑:该实例利用到了一些与文件操作相关的函数。
- fopen 文件的打开函数:
FILE *fp
fp=fopen(文件名,使用文件方式)
例如:fp=fopen("123","r");
它表示要打开名称为123的文本文档,使用文件打开方式为“只读”,fopen函数带回指向123.txt文件的指针并赋给fp,也就是FILE类型指针fp指向123.txt文件。
PS:使用文件方式:
“r” (只读):打开一个文本文件,只允许读数据。
“w” (只写):打开或建立一个文本文件,只允许写数据。
“a” (追加):打开一个文本文件,并在文件末尾写数据。
“rb” (只读):打开一个二进制文件,只允许读数据。
“wb” (只写):打开或建立一个二进制文件,只允许写数据。
“ab” (追加):打开一个二进制文件,并在文件末尾写数据。
“r+” (读写):打开一个文本文件,允许读和写。
“w+” (读写):打开或建立一个文本文件,允许读写。
“a+” (读写):打开一个文本文件,允许读,或在文件末尾追加数据。
“rb+” (读写):打开一个二进制文件,允许读和写。
“wb+” (读写):打开或建立一个二进制文件,允许读和写。
“ab+” (读写):打开一个二进制文件,允许读,火灾文件末尾追加数据。
- fclose 文件的关闭函数:
fclose(文件指针)
作用是通过文件指针将该文件关闭。
- fgetc函数:
ch=fgetc(fp)
该函数作用是从指定的文件(fp指向的文件)读入一个字符赋给ch。注意该文件必须是以读或读写方式打开。
其实,说到这里,大家基本就有了问题的思路了。通过fopen函数打开目标文件,将其内存地址赋给fp。再利用循环结构。通过fgetc函数将文件内字符依次赋给ch,显示在屏幕上。最后通过fclose函数关闭文件。
代码:
1 #include <stdio.h>
2 main()
3 {
4 FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/
5 char ch, filename[50]; /*定义变量及数组为字符型*/
6 printf("please input file`s name;
");
7 gets(filename); /*输入文件所在路径及名称*/
8 fp = fopen(filename, "r"); /*以只读方式打开指定文件*/
9 ch = fgetc(fp); /*fgetc函数带回一个字符赋给ch*/
10 while (ch != EOF) /*当读入的字符值等于EOF时结束循环*/
11 {
12 putchar(ch); /*将读入的字符输出在屏幕上*/
13 ch = fgetc(fp); /*fgetc函数继续带回一个字符赋给ch*/
14 }
15 fclose(fp); /*关闭文件*/
16 }
注意:EOF表示End Of File,文件读取结束。其值通常为-1,也常在其他函数中表达调用失败的意思。EOF只能用于文本文件。
反思:其实一开始接触C语言的文件操作会有一些不理解。但是如果有一定汇编或者Win32基础,就会觉得很好理解它的行为了。原本的文件存放于硬盘内存中,利用fopen函数打开它,就是将其展开到内存空间中,并将其内存地址首地址赋给了fopen函数,即fopen函数的返回值。接下来的行为就和正常C语言中指针读取数组内容相似了。最后,通过fclose函数关闭该文件,即将该文件从内存空间中释放。
实例168 将数据写入磁盘文件
问题:编程实现向任意路径下新建一个文本文档,想该文档中写入you are the best one!,以“#”结束字符串的输入。
逻辑:本实例又用到了一个新的函数。
- fputc函数:
ch=fputc(ch,fp)
该函数作用是将一个字符ch写到fp指向的文件内。
PS:fputc函数的返回值在成功时,为输入的字符,失败时,为EOF。
代码:
1 #include <stdio.h>
2 main()
3 {
4 FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/
5 char ch, filename[50]; /*定义变量及数组为字符型*/
6 printf("please input filename:
");
7 scanf("%s", filename); /*输入文件所在路径及名称*/
8 if ((fp = fopen(filename, "w")) == NULL) /*以只写方式打开指定文件*/
9 {
10 printf("cannot open file
");
11 exit(0);
12 }
13 ch = getchar(); /*fgetc函数带回一个字符赋给ch*/
14 while (ch != '#') /*当输入"#"时结束循环*/
15 {
16 fputc(ch, fp); /*将读入的字符写到磁盘文件上去*/
17 ch = getchar(); /*fgetc函数继续带回一个字符赋给ch*/
18 }
19 fclose(fp); /*关闭文件*/
20 }
注意:代码行.8中条件判断条件“(fp = fopen(filename, "w")) == NULL)”的使用,细细理解。
反思:同样利用汇编基础可以很好理解,不再赘述。
实例169: 格式化读写文件
问题:编程实现将输入的小写字母串写入磁盘文件,再将刚写入磁盘文件的内容读出并以大写字母的形式显示在屏幕上。
逻辑:同样,这次实例又有一些新的函数。
- fprintf函数:
ch=fprintf(文件指针,格式字符串,输出列表)
例如:fprintf(fp,"%d",i);
它表示将整型变量i的值按%d的格式输出到fp指向的文件上。
- fscanf函数:
fscanf(文件指针,格式字符串,输入列表)
例如:fscanf(fp,"%d",&i);
它表示以%d的格式读入fp所指向的文件上i的值。
代码:
1 #include <stdio.h>
2 main()
3 {
4 int i, flag = 1; /*定义变量为基本整型*/
5 char str[80], filename[50]; /*定义数组为字符型*/
6 FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/
7 printf("please input filename:
");
8 scanf("%s", filename); /*输入文件所在路径及名称*/
9 if ((fp = fopen(filename, "w")) == NULL) /*以只写方式打开指定文件*/
10 {
11 printf("cannot open!");
12 exit(0);
13 }
14 while (flag == 1)
15 {
16 printf("
Input string:
");
17 scanf("%s", str); /*输入字符串*/
18 fprintf(fp, "%s", str); /*将str字符串内容以%s形式写到fp所指文件上*/
19 printf("
Continue:?(Y/N)");
20 if ((getchar() == 'N') || (getchar() == 'n')) /*输入n结束输入*/
21 flag = 0; /*标志位置0*/
22 }
23 fclose(fp); /*关闭文件*/
24 fp = fopen(filename, "r"); /*以只写读方式打开指定文件*/
25 while (fscanf(fp, "%s", str) != EOF) /*从fp所指的文件中以%s形式读入字符串*/
26 {
27 for (i = 0; str[i] != '