标准C知识10

来源:互联网 发布:向多个gsm模块发数据 编辑:程序博客网 时间:2024/06/10 08:26
指针数组是一种特殊的数组,它里面的每个变量都是一个指针。声明语法如下
char * value[10];


数组指针是一种特殊的指针,专门用来和数组配合使用的。他们可以用来记录二维数组的名称或一维数组名称的地址。数组指针的声明语法如下
int (*p)[10];
其中p是数组指针的变量名


数组指针加一相当于二维数组名称加一,单位是一个一维数组的大小,数组指针前面加*以后再加一则单位是一个变量的大小。


文件指针是一个指针变量,它和某一个文件对应,对这个文件进行的所有操作都需要通过这个文件指针实现。


fopen函数用于打开文件,fclose函数用于关闭文件。参考04file.c练习


fclose如果失败会返回EOF(-1)。


打开文件时的模式说明分成三个部分
第一部分是必选的,从三个字符中选择一个
"r"表示打开文件进行读操作,文件应该已经存在
“w”表示打开文件进行写操作。(如果文件已经存在则会整个删除这个文件。)
"a"表示打开文件进行写操作。(如果文件已经存在则会把内容追加在原文件末尾)


第二部分是可选的,用字符“+”表示。这个部分表示对文件进行都写两种操作。


第三部分是可选的,用字符"b"表示。这部分表示对文件以二进制方式进行操作。


fputc函数可以把一个字符写入到文件中,失败返回EOF。
fgetc函数可以从文件中读出一个字符,失败返回EOF


fwrite函数可以把一个数组中的多个数据以二进制方式写入到文件中,参考08fwrite.c练习


fread函数参考09fread.c练习


FILE结构体中记录了文件的位置指针,它表示下次文件操作将从文件的什么位置进行。每次完成文件操作后位置指针都会改变。


rewind函数参考10rewind.c练习


ftell函数可以获取位置指针的位置


fseek函数可以把位置指针移动到文件中的任意位置。
文件中的三个基准点
SEEK_SET   0    文件开头
SEEK_CUR   1    位置指针当前位置
SEEK_END   2    文件末尾


fgets可以从文件中以字符串方式读内容
fputs可以向文件中以字符串方式写内容


fscanf函数可以格式化的从文件中读取内容

fprintf函数可以格式化的向文件中写入内容



/*
    指针数组练习
*/
#include <stdio.h>
int main() {
    char str[100] = {0}, num = 0, loop = 0;
    char *value[10] = {NULL};
    char *p_str = str;
    printf("请输入一个字符串:");
    fgets(str, 100, stdin);
    for (loop = 0; loop <= 99; loop++) {
        if (0 == str[loop]) {
            value[num] = p_str;
            num++;
            break;
        }
        else if ('\n' == str[loop]) {
            str[loop] = 0;
            value[num] = p_str;
            num++;
            break;
        }
        else if (' ' == str[loop]){
            str[loop] = 0;
            value[num] = p_str;
            num++;
            p_str = str + loop + 1;
        }
    }
    for (loop = 0; loop <= (num - 1); loop++) {
        printf("%s\n", value[loop]);
    }
    return 0;
}



/*
     指针数组排序练习
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void* p, const void* p1) {
    char **pp = (char**)p;
    char **pp1 = (char**)p1;
    return strcmp(*pp, *pp1);
}
int main() {
    char *str[] = {"China",
                   "France",
                   "England",
                   "Russia",
                   "America"};
    int loop = 0;
    qsort(str, 5, sizeof(char*), compare);
    for (loop = 0; loop <= 4; loop++) {
        printf("%s\n", str[loop]);
    }
    return 0;
}




/*
    数组指针练习
*/
#include <stdio.h>
int main() {
    int value = 0;
    int values[10] = {0};
    int values1[10][10] = {0};
    int *p_value = &value;
    //编译时有警告,运行时出错
    /*int **pp_value = &values;
    printf("%d\n", **pp_value);
    int **pp_value = values1;
    printf("%d\n", **pp_value);*/
    //编译时有警告,运行时正确
    /*p_value = &values;
    printf("%d\n", *p_value);
    p_value = values1;
    printf("%d\n", *p_value);*/
    /*
    int **pp_value = values1;
    printf("values1是%p,*values1是%p\n", values1, *values1);  //二维数组名称和它前面加*得到的地址数据一样
    printf("pp_value是%p,*pp_value是%p\n", pp_value, *pp_value);  //二级指针和在它前面加*得到的地址数据是不一样的*/
    int (*p_arr)[10] = NULL;   //数组指针用来记录一维数组名称的地址或二维数组名称
    p_arr = values1;
    printf("values1是%p,*values1是%p\n", values1, *values1);
    printf("p_arr是%p,*p_arr是%p\n", p_arr, *p_arr);
    printf("p_arr + 1是%p,*p_arr + 1是%p\n", p_arr + 1, *p_arr + 1);
    return 0;
}


/*
    文件操作代码框架
*/
#include <stdio.h>
int main() {
    FILE * p_file = NULL;    //文件指针声明
    p_file = fopen("a.txt", "w");  //代码文件,获得文件指针
    if (!p_file) {
        //如果没有获得有效文件指针
        printf("文件打开失败\n");
        return 0;
    }
    //文件相关操作代码
    fclose(p_file);    //关闭文件,释放文件指针
    p_file = NULL;
    return 0;
}



/*
    fputc练习
*/
#include <stdio.h>
int main() {
    char str[20] = {0};
    int loop = 0;
    FILE * p_file = NULL;    //文件指针声明
    p_file = fopen("a.txt", "w");  //代码文件,获得文件指针
    if (!p_file) {
        //如果没有获得有效文件指针
        printf("文件打开失败\n");
        return 0;
    }
    //文件相关操作代码
    printf("请输入一个字符串:");
    fgets(str, 20, stdin);
    for (loop = 0; loop <= 19; loop++) {
        if (('\n' == str[loop]) || (0 == str[loop])) {
            break;
        }
        else {
            if (EOF == fputc(str[loop], p_file)) {
                break;
            }
        }
    }
    fclose(p_file);    //关闭文件,释放文件指针
    p_file = NULL;
    return 0;
}


/*
    文件复制练习
*/
#include <stdio.h>
int main() {
    char ch = 0;
    FILE *p_src = NULL, *p_dest = NULL;
    p_src = fopen("a.txt", "r");   
    if (!p_src) {
        printf("原文件打开失败\n");
        return 0;
    }
    p_dest = fopen("b.txt", "w");
    if (!p_dest) {
        printf("目标文件打开失败\n");
        fclose(p_src);
        p_src = NULL;
        return 0;
    }
    while (EOF != (ch = fgetc(p_src))) {
        if (EOF == fputc(ch, p_dest)) {
            break;
        }
    }
    fclose(p_src);
    fclose(p_dest);
    p_src = NULL;
    p_dest = NULL;
    return 0;
}



/*
    fwrite练习
*/
#include <stdio.h>
int main() {
    int num = 0;
    int values[] = {5, 6, 7, 8, 9};
    FILE * p_file = NULL;
    p_file = fopen("c.bin", "wb");
    if (!p_file) {
        printf("文件打开失败\n");
        return 0;
    }
    //批量把一个数组以二进制方式写入到文件中,返回值表示写入数据的个数
    num = fwrite(values, sizeof(int), 5, p_file);
    printf("共写入%d个整数\n", num);
    fclose(p_file);
    p_file = NULL;
    return 0;
}



/*
    fwrite练习
*/
#include <stdio.h>
int main() {
    int num = 0, loop = 0;
    int values[5] = {0};
    FILE * p_file = NULL;
    p_file = fopen("c.bin", "rb");
    if (!p_file) {
        printf("文件打开失败\n");
        return 0;
    }
    //批量以二进制方式从文件中读数据记录到数组中,返回读出的数据个数
    num = fread(values, sizeof(int), 5, p_file);
    printf("共读出%d个整数\n", num);
    for (loop = 0; loop <= 4; loop++) {
        printf("%d ", values[loop]);
    }
    printf("\n");
    fclose(p_file);
    p_file = NULL;
    return 0;
}



/*
    rewind练习
*/
#include <stdio.h>
int main() {
    int value = 0;
    FILE * p_file = fopen("c.bin", "rb");
    if (!p_file) {
        printf("打开文件失败\n");
        return 0;
    }
    fread(&value, sizeof(int), 1, p_file);
    printf("%d\n", value);
    printf("位置指针位置是%ld\n", ftell(p_file));
    rewind(p_file);   //把文件位置指针移动到文件开头
    printf("位置指针位置是%ld\n", ftell(p_file));
    fread(&value, sizeof(int), 1, p_file);
    printf("%d\n", value);
    fseek(p_file, 12, SEEK_SET);  //位置指针移动到从文件开头向后12个字节的位置
    fread(&value, sizeof(int), 1, p_file);
    printf("%d\n", value);
    fseek(p_file, -12, SEEK_CUR);  //位置指针移动到当前位置前面12个字节的地方
    fread(&value, sizeof(int), 1, p_file);
    printf("%d\n", value);
    fseek(p_file, -4, SEEK_END);  //位置指针移动到文件末尾前面4个字节的地方
    fread(&value, sizeof(int), 1, p_file);
    printf("%d\n", value);
    fclose(p_file);
    p_file = NULL;
    return 0;
}


/*
     文件格式化操作练习
*/
#include <stdio.h>
int main() {
    /*char ch = 'c';
    int value = 40;
    float f = 4.78f;*/
    char ch = 0;
    int value = 0;
    float f = 0.0f;
    FILE *p_file = fopen("d.txt", "r");
    if (!p_file) {
        printf("文件打开失败\n");
        return 0;
    }
    //fprintf(p_file, "%c %d %g\n", ch, value, f);
    fscanf(p_file, "%c %d %f", &ch, &value, &f);
    printf("%c %d %f\n", ch, value, f);
    fclose(p_file);
    p_file = NULL;
    return 0;
}



/*
     变长参数函数练习
*/
#include <stdio.h>
#include <stdarg.h>


int sum(int cnt, ...) {
    int res = 0, loop = 0;
    va_list v;
    va_start(v, cnt);
    for (loop = 0; loop < cnt; loop++) {
        res += va_arg(v, int);
    }
    va_end(v);
    return res;
}


void show(int cnt, ...) {
    int loop = 0;
    va_list v;
    va_start(v, cnt);
    for (loop = 0; loop < cnt; loop++) {
        printf("%d ", va_arg(v, int));
    }
    printf("\n");
    va_end(v);
}


int main() {
    show(3, 89, 23, 17);
    show(5, 34, 46, 57, 62, 97);
    printf("%d\n", sum(3, 1, 2, 3));
    printf("%d\n", sum(5, 1, 2, 3, 4, 5));
    return 0;
}



/*
    C函数介绍
*/
#include <stdio.h>
#include <stdlib.h>
int main() {
    char ch = 0;
    float f = 0.0f;
    char str[10] = {0};
    printf("atoi(\"453\")是%d\n", atoi("453"));
    printf("atof(\"4.67\")是%lg\n", atof("4.67"));
    sscanf("t 4.78", "%c %f", &ch, &f);
    printf("%c %g\n", ch, f);
    sprintf(str, "%c %g", ch, f);
    printf("%s\n", str);
    return 0;
}



dsa sdags sdg




c 40 4.67

































原创粉丝点击