C语言应用操作之文件
文件是C语言中德中的重点,小编在学习C语言基础知识的时候,大多数的输入输出操作是在屏幕上进行的,现在总算在文件学习上感觉到高大上的样纸。在以前数据量很小时,我们通常将信息从键盘在屏幕上进行输入输出的,but当数据量很大时,则显得很麻烦,因此,我们就要用到小编所说的文件(FILE)。
本贴主要涉及到的知识点具有:
- 文件读操作;
- 文件写操作;
- 文件指针。
一、文件(FILE)简介
在C语言中,文件是由一个个字符组成的,文件中的内容称为文件流。
文件可以分为两种:ASCII文件和二进制文件。
- ASCII文件是通过字符来存储信息的,具有可读性;
- 二进制文件是通过二进制形式来存储信息的,即使用一连串的二进制数来表示,适用于非字符为主的数据。如果以记事本打开,只会看到一堆乱码。 因此,除了文本文件外,所有的数据都可以算是二进制文件。二进制文件的优点在于存取速度快,占用空间小,以及可随机存取数据。
1.1、缓冲文件
根据文件处理方法,文件又可分为:缓冲文件和非缓冲文件两种。但是在标准C语言中则采用缓冲文件。
首先来了解下缓冲区(buffer):指在程序执行时,所提供的额外内存,可用来暂时存放做准备执行的数据。它的作用就是作为中介实现文件的相关操作,为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。
缓冲文件:当进行文件的读操作时,会从文件中读取一部分数据至缓冲区中,再将缓冲区中的文件读取到相应地变量中。当进行文件的写操作时,先将数据写到数据缓冲区中,若缓冲区存储空间满了,再将缓冲区中内容写到文件中。简言之,缓冲区中数据所在的文件就是缓冲文件。
缓冲文件实现文件的读、写操作是通过指针来实现的。
文件的定义形式为:
FILE *指针名;
通过指针来进行文件的相关操作。
1.2、文件指针和位置指针
在对一个文件进行操作之前,首先要定义一个文件指针。指针定义之后通过fopen()函数给文件指针赋值,即使文件指针指向相应的文件。文件指针赋值之后,就可以通过文件指针对文件进行读写等操作。
位置指针用来指明文件当前操作的位置。当调用fopen()函数打开相应文件之后,文件位置指针指向文件开头的第1个字符。当文件位置指针指向文件最后一个字符时,则表示文件结束标志。(C语言中使用feof()函数来检测文件位置指针是否移动到末尾)。
C语言feof()函数的使用:正确的应该是feof()函数返回0表示文件没有结束,返回1,表示结束。feof()函数实际观察的是上次读操作的内容,也就是上次读操作fread()函数返回的值,如果读操作的返回值表明读取的不是空,那feof()函数就返回0,如果上次读操作失败了,则feof返回1,表示读取完了。而fread()函数返回值是表示正确读取的块数,如果不够,则返回0。
二、与文件有关的库函数
2.1文件的打开和关闭函数
fopen()函数
打开一个文件是通过fopen()函数来实现的。fopen()函数的调用形式如下:
file1 = fopen(文件名, 文件操作方式);
例如:
FILE *file1; file1 = fopen("/Users/xxxx/Desktop/input.txt", "r")
通过调用fopen()函数打开当前目录下的input.txt文件,并只能对文件进行写操作,不能进行读操作,是文件指针file1指向文件input.txt,且指向该文件的起始位置(在描述文件路径的时候,要注意绝对路径与相对路径的区别)。
为了判断文件是否打开,可以通过fopen()函数的返回值进行判断。
例如:
if ((file1 = fopen("/Users/xxxx/Desktop/input.txt", "r")) != nil) { for (int i = 0; i < 5; i++) fread(&s[i], sizeof(struct st), 1, file1); }else { printf("file1文件打开错误\n"); exit(1); }
若文件打开失败,则函数fopen()会返回一个null值,因此可以通过判断fopen()函数的返回值来判断文件是否正常打开。
文件的操作方式
mode:打开的模式,规定了是可读、可写、追加之类的属性。
"r":可读,如果文件不存在,fopen调用失败
"w":可写,如果文件存在,那么原来的内容会被销毁。
"a":在文件尾追加,在新的数据写到文件里之前,不改变EOF标记,如果文件不存在,创建一个新的文件。
"r+":可读可写,文件必须存在。
"w+":打开一个空文件用来读写,如果文件存在,则内容被销毁。
"a+":可读可追加,在新的数据写到文件里之前,改变EOF标记;如果文件不存在,创建一个新的文件。
fclose()函数
当对一个文件的操作结束以后,为防止数据内容被改变,就应关闭文件。关闭文件之后,文件指针不再指向文件,除非重新初始化。
文件通过调用fclose()函数实现,其调用形式如下:
FILE *file1,; if ((file1 = fopen("/Users/xxxx/Desktop/input.txt", "r")) != nil) { insert code here。 } fclose(file1);
通过fclose()函数切断了指针file1与文件之间的联系,即关闭了文件。
2.2、文件的读写函数
文件的读写函数有很多种,其中包括fputc()函数、fgetc()函数、fread()函数、fwrite()函数、fprintf()函数和fscanf()函数等。
这里小编就以fread()函数、fwrite()函数两个函数举例说明:
fread()函数
调用形式:
fread(buffer, size, count, file1);
功能:从文件中读取一个数据块,其中buffer为指针类型,表示从文件中读取数据存放的地址。size表示一次读取的字节数,count表示进行多少次的读操作,file1为文件指针,只想要进行操作的文件。
例如以下demo:
struct st { char name[10]; char age[5]; char sex[6]; float score; }s[5]; int main(int argc, const char * argv[]) { for (int i = 0; i < 5; i++) fread(&s[i], sizeof(struct st), 1, file1); for (int i = 0; i < 5; i++) printf("%s,%s,%s,%f",s[i].name,s[i].age,s[i].sex,s[i].score); return 0; }
执行完这些语句,结构体数组s保存了用户的信息,因为fread()函数是将数据写至变量地址中的,因此该参数必须为变量的地址。
fwrite()函数
调用形式:
fwrite(buffer, size, Count, file1);
功能:向文件中写入一个数据块,其中buffer为指针类型,表示从文件中读取数据存放的地址。size表示一次读取的字节数,count表示进行多少次的读操作,file1为文件指针,只想要进行操作的文件。
例如以下demo:
struct st { char name[10]; char age[5]; char sex[6]; float score; }s[5]; int main(int argc, const char * argv[]) { for (int i = 0; i < 5; i++) scanf("%s,%s,%s,%f",&s[i].name,&s[i].age,&s[i].sex,&s[i].score); for (int i = 0; i < 5; i++) fwrite(&s[i], sizeof(struct st), 1, file2); return 0; }
下面是以上函数的简单例子:
By the structure pointer ,to the operation of the file for reading and writing
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 struct st 5 { 6 char name[10]; 7 char age[5]; 8 char sex[6]; 9 float score; 10 }s[5]; 11 12 int main(int argc, const char * argv[]) 13 { 14 //By the structure pointer ,to the operation of the file for reading and writing 15 FILE *file1, *file2; 16 if ((file1 = fopen("/Users/xxxxDesktop/input.txt", "r")) != nil) 17 { 18 for (int i = 0; i < 5; i++) 19 fread(&s[i], sizeof(struct st), 1, file1); 20 }else 21 { 22 printf("file1文件打开错误\n"); 23 exit(1); 24 } 25 if ((file2 = fopen("/Users/xxxx/Desktop/ouput.txt", "w")) != nil) 26 { 27 for (int i = 0; i < 5; i++) 28 fwrite(&s[i], sizeof(struct st), 1, file2); 29 }else 30 { 31 printf("file2文件打开错误\n"); 32 exit(1); 33 } 34 fclose(file1); 35 fclose(file2); 36 37 return 0; 38 }
其运行的最终结果如下图: