文件

  • 栈:局部变量,程序运行期间变量大部分都是有栈分配的,内存空间比较小,系统自动回收资源。

  • 堆:堆空间比较大,可以有程序员自由自配,只能手动申请和释放
    (malloc()申请的空间在堆上,由free()释放掉)
    malloc和free必须成对出现。。

  • 段错误:
    指针:常量指针/NULL/野指针
    数组:数组的越界访问,访问到非法区或者修改了其他的变量
    其他:
    内存不足
    双释放
    内存泄漏

栈和队列

top->栈顶指针
栈:先进后出
队列:后进后出

  • 压栈:push();
  • 出栈:pop();
    每次压栈一次top向上一位。
    当栈顶指针top在栈顶时,满栈!!!
    每出栈一次top向下移一位。
    例如:
    a,b,c,d,e按顺序压入栈中:
    不可能的出栈顺序:
    A:abcde
    B:edcba
    C:decab
    D:decba

  • 条件预编译:
    #if 表达式
    #else
    #endif

文件

-:普通文件
d:目录文件
l:链接文件
p:管道文件
b:块设备文件
c:字符文件
(1)文件系统
文件信息:索引节点(index)
文件操作:文件描述符(fd)
fd最大值
早期的Unix系统: 1024
linux系统: 65535

(2)文件的定义
一组相关数据的有序集合,称为文件!
(3)文件的打开和关闭
打开:fopen(文件名,属性);
关闭:fclose(文件指针);

  • 注:
    文件不关闭,则会造成数据的丢失
    文件指针:
    文件指针结构体:FILE
    包含了文件的基本信息
    定义文件指针
    FILE *指针变量名;
    文件名:可以是已存在的,也可以是不存在的
    属性:
    r(读) w(写) a(追加)
    +: 可读写
    t : 文本文件
    b: 二进制文件
    rt,wt,at,rb,wb,ab,rt+,wt+,at+,rb+,wb+,at+
    r,r+
    w,w+
    a,a+
    rt+/wt+:可读写
    rt/rb:只读
    wt/wb:只写,带w属性的,可以写文件,若文件已存在,则清空,
    重新建立文件;若不存在,则以给定文件名创建文件;
    r:带r属性的文件,文件必须存在!!!

(4)文件的操作
fgetc()/fputc():字符读写函数
fgets()/fputs():字符串读写函数
fsanf()/fprintf():格式化读写函数
fread()/fwrite():块读写函数


  • 重点掌握fscanf()/fprintf()或者fread()/fwrite()至少掌握一种
    在C89标准中,fread()/fwrite()有BUG!!!

文件结束标志:EOF(end or fail)

  • 5.fgetc()/fgets()
    fgetc(文件指针);//从给定文件中读取一个字符
    fgutc(ch,文件指针);//添加一个字符到指定文件中
  • 6.fgets()/fputs()
    fgets(字符数组/字符串常量/指针,size,fp);
    从fp获得size-1长度,在末尾加"\0"
    碰到“EOF”或者换行符结束;
    arr可以是字符数组,或者字符串常量,
    fputs(arr,fp);
    将字符串写入到fp中!!!

stdin: 标准输出---->键盘
stdout:标准输入----->终端
stderr:标准输出----->终端

  • 7,
    fscanf(fp,"格式",参数列表)
    fprintf(fp,"格式",参数列表)
#include
void fscanf_file()
{
    FILE *fp = fopen("123.txt","r");
    if(NULL == fp)
    {
        perror("open failed!\n");
        return;

    }

    int ID;
    char buf[32] = {0};

    fscanf(fp,"%d,%s",&ID,buf);
    //输出文件内容  和fprintf的占位符格式必须一一对应
    printf("ID = %d\tname = %s\n",ID,buf);
    fclose(fp);
);

}
int main()
{
    FILE *fp = fopen("123.txt","w+");
    if(NULL == fp)
    {
        printf("open failed!\n");
        return -1;
    }
    int num = 124;
    char name[32] = "helloo";

    //格式化写入(按一定格式输入)
    fprintf(fp,"%d,%s",num,name);

    fclose(fp);
//  fscanf_file();
    return 0;
}

读取时是什么格式,输出时必须是同样的格式
8.fread()/fwrite() //块读写函数
fread(address,size,count,fp);//读
<-------------
fwrite(address,size,count,fp);//写
--------------->
address:为指针类型,一般为结构体类型
sizeof():一般为结构体类型的大小;
count:一般为1
fp:文件指针

#include
#include
typedef struct student
{
    int ID;
    char name[32];
}STU;

void struct_write(STU temp)
{
    FILE *fp = fopen("struct_read.txt","w+");
    if(NULL == fp)
    {
        perror("open failed!!\n");
        return;
    }

    fwrite(&temp,sizeof(STU),1,fp);
    rewind(fp);
    
    STU stu;
    fread(&stu,sizeof(STU),1,fp);
    printf("ID = %d\nname = %s\n",stu.ID,stu.name);
    fclose(fp);

}
int main(int argc,char *argv[])
{   
    STU stu;
    stu.ID = 123;
    strcpy(stu.name,"defdf");
    struct_write(stu);
    return 0;
}

你可能感兴趣的:(文件)