c++学习笔记--文件

一、文件基础

1、什么是文件

文件:计算机文件属于文件的一种,与普通文件载体不同,计算机文件是以计z算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。

文本文件:
以ascll编写的可视化的字符型文件
不同的文字以特殊编码存在,如gbk,utf-8等

二进制文件:
直接以原生二进制码存放的文件
如bmp等图片文件,MP3等音频文件,EXE等可执行文件

linux一切皆文件

C语言支持的是流式文件,即数据流,它把文件看作一个字节序列,以字节为单位进行访问,没有记录界限,即数据的输入和输出的开始和结束仅受程序控制,而不受物理符号(如回车换行符)控制。

2、数据流

数据流(data stream)是一组有序有起点和终点的的字节的数据序列。数据的输入与输出都必须通过计算机的外围设备,不同的外围设备对于数据输入与输出的格式和方法有不同的处理方式,这就增加了编写文件访问程序的困难程度,而且很容易产生外围设备彼此不兼容的问题。数据流(Data Stream)用来解决这个问题。
数据流将整个文件内的数据看作一串连续的字符(字节),而没有记录的限制。
数据流借助文件指针的移动来访问数据,文件指针目前所指的位置即是要处理的数据,经过访问后文件指针会自动向后移动。
每个数据文件后面都有一个文件结束符号(EOF),用来告知该数据文件到此结束,若文件指针指到EOF便表示数据已访问完毕。

3、标准io与缓存

标准io: 间接调用系统调用函数(代码调用C库函数来间接调用系统函数),头文件是:stdio.h
标准IO操作:fopen fclose (fseek rewind ftell文件读取指针的位置相关指针)
标识文件方法:文件流指针
缓存:用户缓存(标准/文件IO)、内核缓存(标准/文件IO)、库缓存(标准IO);
在这里插入图片描述

4、文件框架

stdio.h

标准输入输出库文件, c语言获取的文件,其使用FILE结构体进行定义的

printf("helloworld"); //  在命令行显示一段内容
fprintf(stdout,"helloworld");    ///  相当于在标准输出文件当中进行输出

这两行代码是实现同样一个功能,printf 相当于是 fprintf 的一种特例,将数据流输出到标准输出文件中。

二、文件处理

1、文件打开与关闭

要打开指定的文件可使用fopen()函数

      FILE *fopen(char *filename,char *mode);

其中第二个参数mode用来设定要打开的文件类型和指定文件的访问模式。
在这里插入图片描述

2、 读写操作

单字符读写函数:fgetc()和fputc()

int fgetc(FILE *fp);

功能:读取文件指针fp目前所指文件位置中的字符,读取完毕,文件指针自动往下移一个字符位置,若文件指针已经到文件结尾,返回-1。 fgetc()函数调用中,读取的文件必须是以读或读写的方式打开的。

int fputc(char ch,FILE *fp);

功能:把字符ch写入文件指针fp所指向文件的位置。 被写入的字符可以用写、读写、追加方式打开。

字符串读写函数:fgets()和fputs():

char *fgets(char *str,int n,FILE *fp);

功能:在文件指针fp所指文件位置读取n个字符并放入str字符数组。

int fputs(char *str,FILE *fp);

功能:将字符串str写入文件指针fp所指文件的位置。

格式化字符串读写函数:fscanf()和fprintf():

int fscanf(FILE *fp,"格式化字符串",【输入项地址表】);

功能:从文件指针fp所指向的文件中按照格式字符串指定的格式将文件中的数据送到输入项地址表中。

int fprintf(FILE *fp,"格式化字符串",【输入项地址表】);

功能:将输出项表中的变量值按照格式字符串制定的格式输出到文件指针fp所指向的文件位置。

数据块读写函数:fread()和fwrite():

int fread(void *buffer,int size,int count,FILE *fp);

功能:从文件指针fp所指向的文件的当前位置开始,一次读入size个字节,重复count次,并将读取到的数据存到buffer开始的内存区中,同时将读写位置指针后移size*count次。

int fwrite(void *buffer,int size,int count,FILE *fp);

功能:从buffer所指向的内存区开始,一次输出size个字节,重复count次,并将输出的数据放入fp所指向的文件中,同时将读写位置指针后移size*count次。

3、其他文件操作

int fseek(FILE *fp,long offset,int whence);

功能:文件指针由whence地址移到offset的地址。
参数1:打开的文件指针
参数2:需要移动的位移量
参数3: 从哪里开始计算位移量

  SEEK_SET   文件头
  SEEK_CUR   当前位置
  SEEK_END   文件头文件尾
void rewind(FILE *fp);

功能:将文件内部的位置指针移到文件的开始位置。

int feof(FILE *fp);

功能:判断指针fp是否处于文件结束的位置。

long ftell(FILE *_File);

功能为:得到流式文件的当前位置,用相对于文件开头的位移量来表示。用fell函数即可以得到当前位置。

几个有用函数

1、使光标跳转到指定行开头

int m;//m为需要跳转的行数
int line; char ch;
while(m!=1)
{
    ch = fgetc(fp);
    line++;
    if(ch=='\n')
    {
  m--;
 }
}  
fseek(fp,line,SEEK_SET); 

2、整型转成字符串

void itoa(int i,char*string)
{
    int power,j;
    j=i;
    for(power=1;j>=10;j/=10)
    power*=10;
    for(;power>0;power/=10)
    {
        *string++='0'+i/power;
        i%=power;
    }
    *string='\0';
}

3、把长字符串分成多个字符串

void string_clipping(char c[],char *b[])
{
  char *p = &c[0];
    char *q = NULL;
    int i, j, n = 0;
    while( *p != '\n' ) 
    {
        if( *p == ' ') {//跳过空格
        p++;
        continue;
        }
        else {
            i = 0;
            while( *( p + i ) != ' ' && *( p + i ) != '\n' )
            i++;
            q = new char[ i + 1 ];//创建一个新的字符数组,存储单词
            for( j = 0; j < i; j++ )
                q[ j ] = p[ j ];
            q[ i ] = '\0';//记得放上结束符
            b[ n++ ] = q;//用字符数组中的元素指向新创建的字符数组
            p += i;
        }
    }
}
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页