c笔记12---数组指针,文件处理 FILE,可变长参数

1.    数组指针和指针数组:
        int value[3] = {5};
        int *p_value = value;            // 普通数组变量声明方法
        int (*p_value1)[3] = &value;    // 数组指针声明方法
    数组指针是对数组名称取地址,和指针数组不一样;
    变量地址可以指这个变量,但是数组名称地址,不代表这个数组,只是编译器临时创建的地址;
    对一维数组名取地址得到的地址数据和二维数组名称代表的地址数据类似;
    对他们做加 1 操作时,增加的是整个一维数组的大小;
    切记:二维数组名称和二级指针是不一样的;
    二级指针加 1 ,增加的是一级指针的大小;
    声明方法:int (*p_value)[5];
    int main()
    {
        int value[3] = {5};
        int values[3][4] = {0};
        printf("%p\n", value);            // 数组首变量地址
        printf("%p\n", &value);            // 数组地址,和value地址在数值上是一样的
        printf("%d\n", *value);            // 输出为:5,相当于value[0]
        printf("%p\n", value + 1);        // 加一个变量大小
        printf("%p\n", &value + 1);        // 加整个数组大小
        printf("%p\n", values + 1);        // 增加一维数组大小
    }

2.    文件处理:FILE结构体,这里引入的指针概念并非真的指针;
    fopen 函数可以打开并连接文件,把结构体变量的地址作为返回值使用,如果执行失败则返回 NULL;
    使用 fopen 函数,需要指定文件操作方式,由三部分构成,分别如下:
        第一部分有三个可选字符 'r','w','a';这部分必须指定一个且只能是一个操作符
            'r':对文件进行读操作;
            'w':对文件进行写操作;如果文件不存在,则创建新文件,否则把原文件内容清除;
            'a':对文件进行写操作;如果文件已存在,则会把新内容追加到文件末尾;
        第二部分有一个可选字符 '+',这部分可有可无;如果使用则表示这部分表示可读可写;如:'a+'(先写后读)
        第三部分有一个可选字符 'b',也是可有可无;如果使用则表示对文件以二进制的方式操作;如:' wb'
    fclose 函数用于关闭一个文件,当程序不再使用这个文件的时候,一定要记得把文件关闭;
    
    fputc 函数可以把一串字符写入到文件中去,一次读一个字符;前一个参数是要写入的文件内容,后一个参数是文件指针;
        如果写入失败,则返回 EOF ;EOF在C语言中宏定义为 -1;
    fgetc 函数可以从文件中读出一个字符并返回,如果超过文件尾部,则返回 EOF;

    FILE 结构体中使用位置指针记录下次对文件进行读写操作的位置;每次对文件进行过读写操作后,位置指针都会移动。
    rewind 函数可以把位置指针移动到开头;(wenjian4.c)

    #include <stdio.h>
    int main()
    {
        FILE *p_file = NULL;
        p_file = fopen("a.txt", "w+");    // fopen前一个参数是文件地址,后一个参数是操作方式
        if (p_file)                        // 如果文件打开失败,即p_file = 0,则不执行下面的操作;
        {
            // 下面这段代码实现写入文件操作
            char str[] = "abcd";
            int loop = 0;
            while (str[loop])            // 如果遇到 /0 则停止循环
            {
                if (EOF == fputc(str[loop], p_file))    // 把数组内容写入p_file,也就是a.txt文件里
                    break;
                loop++;
            }
            // 下面这段代码实现读出文件内容并打印在屏幕上
            rewind(p_file);                // 把写完后的指针移到开头,要不然无法读出
            char ch = 0;                // 用于存放文件中读出的字符
            do {
                ch = fgetc(p_file);        // 读取字符,并存储在ch里,超出文件返回EOF
                if (EOF != ch)            // 因为是先do,所以这里还需要再判断一次ch是否有字符
                    printf("%c", ch);
            } while (EOF != ch);        // 如果 ch 有字符,进入循环
            // 下面两行代码是读写公用的,用于清除并释放文件
            fclose(p_file);                // 清除文件,不能用free,free只是清除内存
            p_file = NULL;                // 这段代码可以不写,写的话只是为了养成良好编程习惯
        }
    }

    fwrite 函数可以一次把数组中多个变量以二进制方式写入文件中,返回值表示写入的变量个数;(wenjian2.c)
        共有四个参数:
            第一个是源文件,要写入的内容,一般是数组名
            第二个是每个变量大小
            第三个是要写入的变量个数,和 fwrite 的返回值一样
            第四个是输出文件指针
    fread 函数可以以二进制的方式把文件中多个变量一次读出,记录在数组中,返回值为变量个数;(wenjian3.c)
        参数同 fwrite
        int strs[5] = {2, 5, 4, 6, 4};
        FILE *p_file = NULL;
        p_file = fopen("a.bin", "w+b");        // 一般以二进制输入
        if (p_file)
        {
            fwrite(strs, sizeof(int), 4, p_file);
            // 下面是读取
            rewind(p_file);                    // 移动指针,否则无法读取
            fread(strs, sizeof(int), 4, p_file);
            int loop = 0;
            for (loop = 0; loop < 4; loop++)    // 把读取到的输出
                printf("%d", strs[loop]);
            // 共同部分        
            fclose(p_file);
            p_file = NULL;
        }


    fseek 函数可以把位置指针移到任何地方;(wenjian5.c)
        c 语言中有三个宏标志文件指针位置:
        SEEK_SET    0    代表文件开头            fseek(p_file, 2, SEEK_SET);        // 指针放到开头第二个字符
        SEEK_CUR    1    代表位置指针当前位置        fseek(p_file, 1, SEEK_SUR);    // 当前指针的下一个指针
        SEEK_END    2    代表文件结尾            fseek(p_file, -5, SEED_END);    // 因为是从末尾倒数,所以为负数

    fputs 函数可以把字符串写到文件中;(不常用)
    fgets 函数可以把文件中读取字符串;

    fprintf 函数可以把数据以指定格式写到任何文件中;
    fscanf 函数可以从任何文件中以指定的格式读入数据变量;

3.    可变长参数,求一组整数中最大值 (canshu.c)
    #include <stdarg.h>        // 使用可变长参数函数,需要包含这个头文件
    int max(int cnt, ...)    // 第一个参数指后面行参个数,后面是省略号
    {
        int ret = 0;        // ret 作为最后函数的返回值
        va_list v;            // 用于获得不确定参数
        va_start(v, cnt);    // 初始化参数
        int loop = 0;        // 遍历用
        for (loop = 0; loop < cnt; loop++)
        {
            int value = va_arg(v, int);        // 从变量 v 里面拿出一个整数
            if (value > ret)
                ret = value;
        }
        va_end(v);            // 清理变量
        return ret;
    }
    int main()
    {
        printf("%d\n", max(2, 6, 9));        // max 参数第一个为变量个数,6 和 9 是参加比较的变量,输出:9
        return 0;
    }

4.    atoi        函数可以把字符串里数字转换为整数输出
    atof        函数可以把字符串里数字转换为浮点数输出
    sscanf        函数可以一次读入多个数据,分别输出
    sprintf        函数把多个字符串按指定格式写入
    举例:(hanshu.c)
    #include <stdlib>
    int main()
    {
        int value = atoi("546");        // 输出:546
        int d_value = atof("23.5");        // 输出:23.5

        char ch = 0;
        float f_value = 0.0f;
        sscanf("25.8 a", "%g %c", &f_value, &ch);        // 注意双引号里面的空格,且顺序要对应
        printf("%g %c\n", f_value, ch);                    // 输出:25.8 a

        char strs[20] = {0};
        sprintf(strs, "%c %g", ch, f_value);            // 第一个参数为字符串数组名
        printf("%s\n", strs);                            // 输出:25.8 a
    }

发布了57 篇原创文章 · 获赞 19 · 访问量 10万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章