C语言复习3/27

1.指向指针的指针

#include<stdio.h>
int main()
{
    char *a[] = { "hello","world","my","love" };
    char **p;              //*p表示p为指针变量,char *表示p指向char *类型的变量
    p = a;                   //p = &a[0]
    printf("%s\n", *p);//输出a[0]
    return 0;
}

2.函数指针

int (*p)(int, int);//定义一个函数指针p,指向的函数有两个int类型的形参,函数返回值为int型。

#include<stdio.h>
int main()
{
    void(*p)(int, int);
    void max(int, int);
    void min(int, int);
    int n = 0;
    scanf_s("%d", &n);
    if (n == 1)
        p = max;
    else
        p = min;
    (*p)(3, 4);
    return 0;
}

void max(int x, int y)
{
    printf("%d\n", x > y ? x : y);
}

void min(int x, int y)
{
    printf("%d\n", x < y ? x : y);
}

函数指针就是函数的入口地址。

3.结构体

/*方法一*/
struct Student
{
    ...
}student1,student2;
/*方法二*/
struct Student
{
    ...
};

struct Student student1, student2;//struct Student是类型名
/*方法三*/
typedef struct
{
    ...
}Student;
Student student1, student2;
/*方法四*/
struct
{
      ...
}student1,student2;

4.文件类型指针

typedef struct
{
    short level;          //缓冲区“满”或“空”的程度
    unsigned flags;       //文件状态标志
    char fd;              //文件描述符
    unsigned char hold;   //如缓冲区无内容不读取字符
    short bsize;          //缓冲区的大小
    unsigned char* buffer;//数据缓冲区的位置
    unsigned char* curp;  //指针当前的指向
    unsigned istemp;      //临时文件指示器
    short token;          //用于有效性检查
}FILE;

声明FILE结构体类型的信息包含在头文件“stdio.h”中。在程序中可以直接使用FILE类型名定义变量,每一个FILE类型变量对应一个文件的信息区,在其中存放该文件的有关信息。

FILE *fp;//定义一个指向文件的指针变量fp;

4.文件操作

  • fopen(文件名,使用文件方式);

通常将fopen函数的返回值赋给一个指向文件的指针变量。

FILE *fp;

fp = fopen("a1","r");

这样fp就和文件a1相联系了,或者说fp指向了a1文件

//计算机从ASCII文件读入字符时,遇到回车换行符,系统把它转换为一个换行符,在输出时把换行符转换成回车和换行两个字符。在使用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。

fclose(文件指针);//若函数成功执行返回0,否则返回EOF(即-1)

  • fclose(fp);

如果不关闭文件将会丢失数据。因为,在向文件写数据时,是先将数据输出到缓冲区,待缓冲区满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就有可能使缓冲区中的数据丢失。用fclose函数关闭文件,先把缓冲区中的数据输出到磁盘文件,然后才撤销文件信息区。有的编译系统在程序结束前会自动先将缓冲区中的数据写入到文件,从而避免了这个问题,但是应当养成在程序终止之前关闭所有文件的习惯。

  • 向文件读写字符

fgetc(fp);//从fp指向的文件中读入一个字符,读成功,带回所读的字符,否则返回EOF

fputc(ch,fp);//把字符ch写到文件指针变量fp指向的文件中,输出成功,返回值就是输出的字符,输出失败,则返回EOF

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    char ch, filename[30];
    printf("请输入所用的文件名:");
    scanf("%s", filename);
    if ((fp = fopen(filename, "w")) == NULL)
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    ch = getchar();                           //用来接收输入完文件名后的回车符
    printf("请输入一个准备存储到磁盘中的字符串(以#结束):");
    ch = getchar();
    while (ch != ‘#‘)
    {
        fputc(ch, fp);
        putchar(ch);
        ch = getchar();
    }
    fclose(fp);
    putchar(10);                             //向屏幕输出一个换行符
    return 0;
}
//将一个文件中的内容复制到另一个文件中#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp_in,*fp_out;
    char ch, filename_in[30],filename_out[30];
    printf("请输入读入的文件名:");
    scanf("%s", filename_in);
    if ((fp_in = fopen(filename_in, "r")) == NULL)
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    printf("请输入写出的文件名:");
    scanf("%s", filename_out);
    if ((fp_out = fopen(filename_out, "w")) == NULL)
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    while (!feof(fp_in))                  //feof函数的作用是检查是否到文件末尾
    {
        ch = fgetc(fp_in);
        fputc(ch, fp_out);
        putchar(ch);
    }
    putchar(10);
    fclose(fp_in);
    fclose(fp_out);
    return 0;
}

注意:C系统已把fputc和fgetc函数定义为宏名putc和getc

#define     putc(ch,fp)     fputc(ch,fp)

这是在stdio.h中定义的

  • 向文件读写字符串

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

从fp指向的文件中读取n - 1个字符,在字符串后加‘\0‘,把它们放到字符数组str中。如果在读完n - 1个字符之前遇到换行符‘\n‘或文件结束符EOF,读入即结束,但将所遇到的换行符‘\n‘也作为一个字符读入。若执行fgets函数成功,则返回值为str数组首元素的地址,如果一开始就遇到文件尾或读数据出错,则返回NULL。

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

将str所指向的字符串输出到fp指向的文件中。字符串末尾的‘\0‘不输出。若输出成功,函数值为0,失败时,函数值为EOF。

  • 用二进制方式向文件读写一组数据

C语言允许用fread函数从文件中读一个数据块,用fwrite函数向文件写一个数据块。在读写时是以二进制形式进行的。在向磁盘写数据时,直接将内存中的一组数据原封不动、不加转换地复制到磁盘文件上,在读入时也是将磁盘文件中若干字节的内容一批读入内存。一般调用形式为:

fread(buffer,size,count,fp);

fwrite(buffer,size,count,fp);

其中:

buffer:是一个地址。对fread来说,它是用来存放从文件读入的数据的存储区地址。对fwrite来说,是要把此地址开始的存储区中的数据向文件输出(以上指的是起始地址)。

size:要读写的字节数

count:要读写多少个数据项(每个数据项长度为size)

fp:FILE类型文件指针

在打卡文件时指定用二进制文件,这样可以用fread和fwrite函数读写任何类型的信息。

时间: 2024-11-13 14:11:07

C语言复习3/27的相关文章

C语言复习(一)关键字

最近在学COCOS2Dx,刚刚开始写一个塔防游戏,因为第一次用VS2012,感觉还不太习惯. C语言的大部分内容也忘记了,因此做一个简要的复习. 1.关键字: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef unsigne

C语言复习3/6日

1.变量:变量代表一个有名字的.具有特定属性的一个存储单元.它用来存放数据,也就是存放变量的值.在程序运行期间,变量的值是可以改变的.变量必须先定义后使用.变量名和变量值是两个不同的概念.变量名实际上是以一个名字代表的一个存储地址.在对程序编译连接时由编译系统给每一个变量名分配对应的存储地址.从变量中取值,实际上是通过变量名找到对应的内存地址,从该存储单元中读取数据. 2.符号常量:用#define指令,指定用一个符号名称代表一个常量.如#define  PI  3.14 注意:符号常量不是变量

cpp学习(二)C语言复习

接下来复习一下C语言部分,毕竟C++与C语言本自同根生,并且在汇编层面C与C++可以说完全相同.假如你没有C语言基础的话,可以先暂停去学习一下C语言,C语言可以看"C语言之父"谭浩强的<C语言程序设计>或者观看学堂在线的免费公开课,在此推荐清华大学的c++课程:http://www.xuetangx.com/courses/course-v1:TsinghuaX+00740043X_2015_T2+sp/courseware/a0f3bf5a4c044dfaaad68148

c语言复习 —— 数组

数组的产生:数据是一种存放数据的容器.所以:一个数组中里面的元素是同一种类型的. 一维数组: 1.定义: 类型 名称 [元素数量] 注意:元素数量必须是整数,c语言中没有对象这个概念,所以存放的都是基本的数据类型,而在oc中的数组中存放的是必须是对象. 在c99之前,元素数量必须子编译的时候定义下来,而c99之后,确实可以没有没有定义下来. eg: int[10];//表示定了10个元素的数组,为整数类型. 2.特点: 1)所有的元素都是具有相同的类型. 2)一旦创建,就不能够更改. 3)数组中

简单链表-C语言复习

实现一个基本的链表,包括在链表后添加数据节点和输出链表i所有数据的功能 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct node 5 { 6 int data; 7 struct node *link; 8 }NODE; 9 10 //定义头指针 11 NODE *head; 12 13 void add(int data) 14 { 15 16 NODE *p; 17 p=(NODE *)malloc(siz

C语言复习3/9

1.C语言中定义数组的形式为:类型符  数组名[常量表达式],常量表达式中可以包括常量和符号常量,如"int a[3+5];"是合法的.不能包含变量,如"int a[n];"是不合法的.也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值.如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式.如: void func(int n) { int a[2 * n]; //合法,n的值从实参传来 . . . }

C语言复习

函数里面不能嵌套函数  这两个的区别是什么呢 #define a int[10] 属于宏定义,在编译的时候只进行替换,而不进行类型检查:typedef int a[10]: 只不过给int型取个别名,在编译的时候会进行类型检查. typedef 类型 别名;                  类型别名    用这个 #define 名字 替换成的字符          宏定义   只是把一个你写的东西替换成另一种东西,比如#define Hello "hello",把Hello替换成&

C语言复习——指针 链表 与 文件操作

刚刚进入大二,准备开始学习C++,对大一所学的C语言一次练习,正好也是赶上老师布置的任务,用C语言写一个  销售管理系统  ,就尽可能的把所学的都用上,也就是结构,指针,文件操作,还有数据结构,本次加入了链表. 用两个函数 Load_LinkList() 和 Save_LinkList() 让链表与文件操作结合,除了打印函数,其他都是在内存中操作链表,这样写更有条理,在创建链表时没有采用书上的用一个中间变量引导,并插入到结点前面,而是直接在链表尾的next申请内存,便于理解,操作也方便. /*首

C语言复习&mdash;&mdash;用到的小知识

1. 在C语言中,怎么查看一个数据类型占用了多少个字节大小呢? 可以使用sizeof(int)/sizeof(double)等来查看某数据类型到底用了几个字节: 注意:sizeof 它并不是一个函数,而是一个单目操作符, 2. C语言中常见的数据类型: 整型分为有符号整型(signed)和无符号整型(unsigned ), 它们各自又可以分为 长整型(long), 短整型(short), 整型(int)和字符型(char), 所以结合起来一共有8种基本的整型结构: long/short/int/