C语言的io操作
写文件
#include<stdio.h>
#include<string.h>#define FILE_NAME "log.txt"
int main()
{FILE * fp = fopen(FILE_NAME, "w");if(fp==NULL){printf("fopen error!\n");}const char* msg = "hello zk\n";int cnt =5;while(cnt--){fwrite(msg,strlen(msg),1,fp);}fclose(fp);return 0;
}
接口介绍
fopen函数,第一个参数是文件的路径,第二个参数是mode 有 r w r+ w+等等.返回值返回的是一个文件指针。
r:只读,不存在文件则会报错。
w:写文件,不存在文件则会创建一个文件
r+:读写文件,不存在文件则会报错
w+::读写文件,不存在文件则会创建一个文件
FILE *fopen(const char *path, const char *mode);
fclose,参数是是一个文件指针
int fclose(FILE *fp);
fwrite
参数的意义,第一个是写的消息,第二个是消息的大小,第三个是每一个字符的大小,最后一个是文件指针。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
结果
读文件
#include<stdio.h>
#include<string.h>#define FILE_NAME "log.txt"
int main()
{FILE * fp = fopen(FILE_NAME, "r");if(fp==NULL){printf("fopen error!\n");}char buffer[1024];//while(cnt--)//{//fwrite(msg,strlen(msg),1,fp);//}while(fgets(buffer, sizeof(buffer), fp) != NULL) // 使用sizeof并检查返回值{printf("%s", buffer); // fgets自动添加'\0'和保留换行符,不需额外处理}fclose(fp);return 0;
}
结果
[zk@VM-24-17-centos lesson16]$ ./test
hello zk
hello zk
hello zk
hello zk
hello zk
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);char *fgets(char *s, int size, FILE *stream);
追加文件
#include<stdio.h>
#include<string.h>#define FILE_NAME "log.txt"
int main()
{FILE * fp = fopen(FILE_NAME, "a");if(fp==NULL){printf("fopen error!\n");}//char buffer[1024];const char* msg = "hello zk\n";int cnt=5;while(cnt--){fwrite(msg,strlen(msg),1,fp);}//while(fgets(buffer, sizeof(buffer), fp) != NULL) // 使用sizeof并检查返回值//{//printf("%s", buffer); // fgets自动添加'\0'和保留换行符,不需额外处理//}fclose(fp);return 0;
}
结果
接下来就是操作系统的接口了
open
int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);
c语言,java语言,python语言。都有io操作,那操作系统只有一个,怎么版本。那就学习操作系统的接口。知其所以然
我们先介绍flag是什么。在C语言中没有bool类型,这时候用bit位来当作标志的判断。
O_CREAT 创建
O_APPEND 追加
O_TRUNC 清空
O_RDONLY 只读
我们先介绍这个东西的原理
看代码
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define ONE (1<<0) // 0000 0001
#define TWO (1<<1) // 0000 0010
#define THREE (1<<2) // 0000 0100
#define FOUR (1<<3) // 0000 1000void print1(char n)
{if(n&ONE){printf("one");}if(n&TWO){printf("two");}if(n&THREE){printf("three");}if(n&FOUR){printf("four");}printf("\n");
}
int main()
{print1(ONE);print1(ONE|TWO);return 0;
}
[zk@VM-24-17-centos lesson16]$ ./test
one
onetwo
前面的4个宏就相当于这里的define,
现在来看看使用
int open(const char *pathname, int flags);
看代码