文件操作
# 1 对文件的操作步骤
1)引入头文件(stdio.h)
2)定义文件指针
3)打开文件
4)文件读写
5)关闭文件
# 2 缓冲文件系统
所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区 从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去 如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量) ,有输入文件缓冲区和输出文件缓冲区。
输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输出形象地称为流(stream),即数据流。流表示了信息从源到目的端的流动。
# 3 标准的文件读写
# 3.1 文件的打开fopen()
文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头。
# 3.2 关闭文件函数fclose()
文件操作完成后,必须要用fclose()函数进行关闭,这是因为对打开的文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中去而丢失。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区。
# 3.3 文件的读写
- 读写文件中字符的函数(一次只读写文件中的一个字符):
int fgetc(FILE *stream); //将流指针指向的文件中的一个字符读出,若当时文件指针指到文件尾,即遇到文件结束标志EOF(其对应值为-1),该函数返回一个-1给ch,在程序中常用检查该函数返回值是否为-1来判断是否已读到文件尾,从而决定是否继续。
int fputc(int ch,FILE *stream);
#include <stdio.h>
int main(void)
{
FILE *fp;
char ch;
if((fp=fopen("myfile.txt","r"))==NULL)
{
printf("file cannot be opened\n");
exit(1);
}
while((ch=fgetc(fp))!=EOF) {
fputc(ch,stdout);
}
fclose(fp);
return 0;
}
int getc(FILE *stream);
int putc(int ch,FILE *stream);
- 读写文件中字符串的函数
char *fgets(char *string,int n,FILE *stream); //将把由流指针指定的文件中n-1个字符,读到由指针stream指向的字符数组中去
#include <stdio.h>
int main(void)
{
FILE *fp;
char str[128];
if((fp=fopen("test.txt","r"))==NULL)
{
printf("cannot open file\n");
exit(1);
}
while(!feof(fp))
{
if(fgets(str,128,fp)!=NULL) printf("%s",str);
}
fclose(fp);
return 0;
}
int fprintf(FILE *stream,char *format, ...);//向流指针指向的文件输出。
int fputs(char *string,FILE *stream);//将指定文件写入一个由string指向的字符串,'\0'不写入文件。
- 文件二进制块读写函数
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
# 3.3 清除和设置文件缓冲区
int fflush(FILE *stream); fflush()函数将清除由stream指向的文件缓冲区里的内容,常用于写完一些数据后,立即用该函数清除缓冲区,以免误操作时,破坏原来的数据。
# 3.4 文件的随机读写函数
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
//返回值:成功返回0,出错返回-1并设置errno
//whence参数的含义如下:
//SEEK_SET
// 从文件开头移动offset个字节
//SEEK_CUR
// 从当前位置移动offset个字节
//SEEK_END
// 从文件末尾移动offset个字节
long ftell(FILE *stream);
//返回值:成功返回当前读写位置,出错返回-1并设置errno
void rewind(FILE *stream);
//设置文件位置为给定流stream文件的开头