INDEX
文件 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