1. FILE的数据类型介绍
在C语言中,FILE的数据类型是一个结构体指针类型,又称为文件指针类型。它用于表示一个文件,并且提供了一系列操作文件的函数。
在stdio.h头文件中,定义了一个FILE类型,它实际上是一个结构体指针类型。该结构体中包含了文件的各种属性,例如文件名、文件位置指针、缓冲区和文件状态等。
文件指针是FILE类型变量的值,可以用于标识每个文件的唯一实例。通过操作文件指针,我们可以对文件进行读写操作。
2. 文件的打开和关闭
2.1 文件的打开
要对文件进行读写操作,我们首先需要打开这个文件。在C语言中,可以使用fopen函数来打开一个文件。该函数的原型如下:
FILE *fopen(const char *filename, const char *mode);
其中,filename为要打开的文件名,mode为打开文件的模式。mode参数包含了一系列字符,用于指定打开文件的方式和操作类型。
例如,为了读取一个文件,我们可以使用下面的代码:
FILE *fp;
fp = fopen("example.txt", "r");
上述代码打开了一个名为example.txt的文件,并将其关联到一个文件指针变量fp上。fopen函数返回一个文件指针,如果打开文件失败则返回NULL。
2.2 文件的关闭
在C语言中,文件使用后必须关闭。使用fclose函数可以将已打开的文件关闭。
int fclose(FILE *stream);
该函数以文件指针作为参数,返回一个整数值。如果关闭文件成功,则返回0,否则返回EOF。
3. 文件的读写操作
3.1 文件的写入
在C语言中,可以使用fputc函数将一个字符写入文件中。该函数原型如下:
int fputc(int c, FILE *stream);
其中,c是要写入的字符,stream是文件指针。如果写入成功,则返回写入的字符,否则返回EOF。
下面是一个简单的示例,将字符串写入到文件中:
#include <stdio.h>
int main(){
FILE *fp;
fp = fopen("example.txt", "w");
if(fp){
fputs("hello world",fp);
fclose(fp);
}
return 0;
}
上述代码中,我们使用fputs函数将字符串"hello world"写入到文件example.txt中。注意,在写入数据后,需要使用fclose函数关闭文件。
3.2 文件的读取
在C语言中,可以使用fgetc函数从文件中读取一个字符。该函数原型如下:
int fgetc(FILE *stream);
其中,stream是文件指针。如果读取成功,则返回读取的字符,否则返回EOF。
下面是一个简单的示例,从文件中读取数据并打印:
#include <stdio.h>
int main(){
FILE *fp;
int c;
fp = fopen("example.txt", "r");
if(fp){
while((c=fgetc(fp)) != EOF){
putchar(c);
}
fclose(fp);
}
return 0;
}
上述代码中,我们使用while循环和fgets函数从文件中读取数据,并将其打印到屏幕上。注意,在读取完文件后,需要使用fclose函数关闭文件。
3.3 二进制文件的读写
在C语言中,可以使用fwrite和fread函数进行二进制文件的读写操作。这两个函数可以读写任何类型的数据,包括整型、浮点型和结构体等。
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
其中,ptr为要读写的数据的地址,size为每个数据项的大小,count为数据项的个数,stream是文件指针。如果读写成功,则返回读写的数据块数,否则返回0。
下面是一个简单的示例,将一个结构体写入到文件中并读取出来:
#include <stdio.h>
struct Person{
char name[20];
int age;
float weight;
};
int main(){
FILE *fp;
struct Person p1={"Tom",20,65.0};
struct Person p2={"Jerry",19,55.0};
struct Person p_read;
fp=fopen("test.bin", "wb");
if(fp){
fwrite(&p1,sizeof(p1),1,fp);
fwrite(&p2,sizeof(p2),1,fp);
fclose(fp);
}
fp=fopen("test.bin", "rb");
if(fp){
while(fread(&p_read,sizeof(p_read),1,fp)>0){
printf("name:%s,age:%d,weight:%f\n",p_read.name,p_read.age,p_read.weight);
}
fclose(fp);
}
return 0;
}
上述代码中,我们定义了一个名为Person的结构体,将其写入到文件中并读取出来。注意,在写入和读取数据之前,需要使用fopen函数打开文件,并使用fclose函数关闭文件。
4. 文件定位
在C语言中,可以使用fseek和ftell函数进行文件定位。fseek函数用于移动文件指针的位置,ftell函数用于获取文件指针的位置。
int fseek(FILE *stream, long int offset, int whence);
long int ftell(FILE *stream);
其中,stream是文件指针,offset为移动的偏移量,whence是移动的方式。
下面是whence参数的几种取值:
- SEEK_SET:从文件开头开始移动指定字节数;
- SEEK_CUR:从当前位置开始移动指定字节数;
- SEEK_END:从文件末尾开始移动指定字节数。
fseek函数移动成功时返回0,否则返回EOF。ftell函数返回当前文件指针相对于文件开头的字节数。
下面是一个简单的示例,将文件指针移动到文件的末尾,并获取文件大小:
#include <stdio.h>
int main(){
FILE *fp;
long int size;
fp=fopen("example.txt", "r");
if(fp){
fseek(fp,0,SEEK_END);
size=ftell(fp);
printf("file size:%ld\n",size);
fclose(fp);
}
return 0;
}
上述代码中,我们首先打开了一个文件,并使用fseek函数将文件指针移动到文件的末尾。然后,使用ftell函数获取文件大小,并将其打印到屏幕上。
5. 总结
在C语言中,FILE类型提供了一些函数,用于对文件进行读写操作。我们可以使用fopen函数打开一个文件,使用fclose函数关闭一个文件,使用fputc函数向文件写入一个字符,使用fgetc函数从文件中读取一个字符。而对于二进制文件的读写操作,则可以使用fwrite和fread函数。
在读写文件时,文件指针的位置非常重要。我们可以使用fseek函数移动文件指针的位置,并使用ftell函数获取文件指针的位置。了解了这些文件操作的基本方法后,我们就可以进行更加复杂的文件操作,如读写大文件、复制文件、分割文件等。