C语言语法摘要

INDEX

  1. 文件I/O
    1. 高级访问
    2. 错误处理
    3. 底层访问
  2. 用户定义类型
    1. 结构体
    2. 联合体
    3. 枚举
    4. 位域
    5. 类型定义

文件 I/O

高级访问

#include <stdio.h>  /* 以下函数的头文件 */
FILE* fopen(char *fileName, char *mode);

返回一个有关文件名的FILE指针或者错误发生时返回NULL. 模式是r(读), w(写), a(追加). 这是三个特殊的指针, stdin(标准输入), stdout(标准输出), stderr(标准错误)

int getc(FILE *filePointer);

返回 filePointer 引用的文件流中的下一个字符。如果文件结尾或发生错误,则返回 EOF。

int putc(int c, FILE *filePointer);

将字符 c 写入 filePointer 引用的文件。如果发生错误,则返回写入的字符或 EOF。

int fprintf(FILE *filePointer, char *format, ...);
int fscanf(FILE *filePointer, char *format, ...);

用于文件的格式化输入/输出

char *fgets(char *line, int MAX_CHAR, FILE *filePointer);

从文件指针引用的文件中读取下一行到字符数组行中。将读取 MAX_CHAR – 1 个字符。
如果发生 EOF 或错误,则返回指向行的指针或 NULL。

int fputs(char *line, FILE *filePointer);

将字符串写入文件。如果发生错误,则返回 EOF,否则返回零。

int remove(const char *fileName);

从文件系统中删除 fileName。如果尝试失败,则返回非零值。

int rename(const char *oldFileName, const char *newFileName);

将 oldFileName 重命名为 newFileName。如果尝试失败,则返回非零值。

FILE* tmpfile(void);

创建一个文件模式为wb+的临时文件. 当文件关闭时, 他会被自动删除.

int fclose(FILE *filePointer);

关闭文件.

错误处理

int ferror(FILE *filePointer);  /* 如果发生错误,则返回非零值 */
int feof(FILE *filePointer);    /* 如果发生 eof,则返回非零 */
void perror(FILE *filePointer, chars *s);

如果未指定参数或 s,则将交互式错误消息打印到 filePointer。

底层访问

#include <fcntl.h>  /* 以下函数的头文件 */
int open(char *name, int flags, int perms);

返回与文件关联的整数,称为文件描述符。
当 shell 运行程序时,会自动打开三个文件:标准输入、标准输出和标准错误。
它们关联的文件描述符为 0、1 和 2。

以下是一些标志:

O_RDONLY - Open file in read only mode
O_WRONLY - Open file in write only mode
O_RDWR - Open file in read / write mode

Perm 是 unix 文件权限,以 3 位八进制数指定。

int create(char *name, int perms);

使用名称创建文件并返回与其关联的文件描述符。如果失败则返回 -1。

#include <unistd.h>     /* 以下函数的头文件 */
int read(int fileDescriptor, char *buffer, int n);

从与 fileDescriptor 关联的文件中读取 n 个字节到缓冲区数组中。返回传输的字节数。返回值为零表示 EOF,-1 表示错误。

int write(int fileDescriptor, char *buffer, int n);

从缓冲区数组将 n 个字节写入与 fileDescriptor 关联的文件。它返回写入的字节数。

long lseek(int fileDescriptor, long offset, int origin);

将文件的当前位置设置为偏移量,该偏移量相对于 origin 指定的位置。Orgigin 可以是 0、1 或 2,以指定偏移量是从文件的开头、当前位置或结尾测量的。

int unlink(const char *path);

删除文件。成功时返回 0,否则返回 -1。

int close(int fileDescriptor);

Closes a file.


自定义类型

结构体

Creating a structure:

struct packet{
    int size;
    double length;
    double breadth;
};

Usage:

/* structure variable */
struct packet p;
p.size = 50;

/* structure pointer */
struct packet *p;
p = (struct packet *)malloc(sizeof(struct packet));
p->size = 100;

联合体

与结构相同,但字段共享内存。联合中的所有字段在内存中具有相同的地址。示例:

#include <stdio.h>
#include <string.h>
#include <inttypes.h>

typedef const unsigned char *byte_ptr;

void show_bytes(byte_ptr bytes, int size);

int main(int argc, char *argv[]) {
    union S {
        uint32_t w;    
        uint16_t hw;
        uint8_t b;
    };

    union S data = {0xABCDEF12};
    show_bytes((unsigned char *)&data.w, sizeof(uint32_t));
    show_bytes((unsigned char *)&data.hw, sizeof(uint16_t));
    show_bytes((unsigned char *)&data.b, sizeof(uint8_t));

    // print address of the fields
    printf("S.w -- > %pn", &data.w);
    printf("S.hw -- > %pn", &data.hw);
    printf("S.b -- > %pn", &data.b);
    return 0;
}

void show_bytes(byte_ptr bytes, int size) {
    for(int i = 0; i < size; i++) {
        printf(" %.2x", bytes[i]); 
    }

    printf("n");
}

输出(由于这是在小端机器中测试的,因此字节是反转的):

12 ef cd ab
12 ef
12
S.w --> 0x7ffee41bda70
S.hw --> 0x7ffee41bda70
S.b --> 0x7ffee41bda70

枚举类型

enum Type{
    INT,    // INT = 0
    DOUBLE, // DOUBLE = 1
    CHAR    // CHAR = 2
};

int main(){
    /* 可以像常规变量一样处理 */
    enum Type t;

    /* 值赋值可以是枚举成员之一 */
    t = INT;

    /* 可以直接使用,无需枚举变量 */
    if(t == INT){
        printf("This is an integer.n");
    }
    else if(t == DOUBLE){
        printf("This is a double.n");
    }
    else if(t == CHAR){
        printf("This is a character variable.n");
    }

    return 0;
}

位域

位域用于打包不同的变量到一个机器字节中. 位域的定义像普通的结构体.但是边磊类型必须为unsigned int并且每个变量的位长度要用:操作符说明.

struct flags{
    unsigned int is_color:1 // 1 bit length
    unsigned int is_sound:1 // 1 bit length
    unsigned int is_open:1  // 1 bit length
    unsigned int status:4   // 4 bit length
};

类型定义

Typedefs用于为类型结构体定义一个别名.

typedef TYPE ALIAS

例子:

typedef double dist_t; // 可以使用 dist_t 代替 double

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部