1.标准IO
1.1 打开文件
* FILE * fopen(const char *__restrict__ __filename, const char *__restrict__ __modes)
* char *__restrict__ __filename:字符串表示要打开的文件
* char *__restrict__ __modes:访问模式
r:只读模式,文件不存在报错
w:只写模式 如果文件存在清空文件,不存在就创建新文件
a:只追加写模式 如果文件存在末尾追加写,不存在就创建新文件
r+:读写模式 ,文件不存在报错
w+:读写模式 如果文件存在清空文件,不存在就创建新文件
a+:读追加写模式 如果文件存在末尾追加写,不存在就创建新文件
* 返回值:FILE * 结构体指针 表示一个文件,报错返回NULL
1.2 关闭文件
* int fclose (FILE *__stream)
* FILE *__stream:需要关闭的文件
* 返回值:成功返回0 失败返回EOF(负数) 通常关闭文件失败会直接报错
1.3 写字符
* int fputc(int __c, FILE *__stream)
* int __c:ASCII码对应的char
* FILE *__stream:打开的一个文件
* 返回值:成功返回的char 失败返回EOF
1.4 写字符串
* int fputs(const char *__restrict__ __s, FILE *__restrict__ __stream)
* char *__restrict__ __s:需要写入的字符串
* FILE *__restrict__ __stream:需要写入的文件
* 返回值:成功返回非负整数 失败返回EOF
1.5 写入格式化字符串
* int fprintf(FILE *__restrict__ __stream, const char *__restrict__ __format, ...)
* FILE *__restrict__ __stream:打开的文件
* const char *__restrict__ __format:带格式化的长字符串
* ...:可变参数,填入格式化的长字符串
* 返回值:成功返回写入的字符个数 不包含换行符 失败返回-1
1.6 读取一个字节
* int fgetc(FILE *__stream)
* FILE *__stream:打开的文件
* 返回值:读取到的一个字节 如果出错或到文件末尾返回EOF
1.7 读取字符串
* char * fgets(char *__restrict__ __s, int __n,FILE *__restrict__ __stream)
* char *__restrict__ __s:接收读取到的字符串
* int __n:接收数据的长度
* FILE *__restrict__ __stream:打开要读取的文件
* 返回值:成功返回字符串 失败返回NULL
1.8 读取格式化的字符串
* int fscanf(FILE *__restrict__ __stream,const char *__restrict__ __format, ...)
* FILE *__restrict__ __stream:打开的文件
* const char *__restrict__ __format:带有格式化的字符串(固定格式接收)
* ...:可变参数,填写格式化的字符串(接收数据提前声明的变量)
* 返回值:成功匹配到的参数的个数 如果匹配失败返回0 报错或文件结束EOF
1.9 标准输入/输出/错误
char *ch = malloc(10);
//标准输入
fgets(ch,10,stdin);
printf("你好:%s\n",ch);
//标准输出
fputs(ch,stdout);
printf("\n");
//错误输出
fputs(ch,stderr);
printf("\n");
return 0;
结果:
11111111111
你好:111111111 //标准输入
111111111 //标准输出
111111111 //错误输出
标准输出和错误输出的管道不同
2.系统调用
2.1 打开或创建文件
* int open(const char *__file, int __oflag, ...)
* char *__file:打开的文件
* int __oflag:文件的模式
O_RDONLY 只读模式
O_WRONLY 只写模式
O_RDWR 读写模式
O_CREAT 如果不存在创建文件
O_APPEND 追加写模式
O_TRUNC 截断文件长度
* ...可变参数:O_CREAT 创建文件的权限
* 返回值:文件描述符 如果打开文件失败 返回-1 同时设置全局变量error表示对应的错误
2.2 系统调用用于读取已经打开的文件描述符
* ssize_t read(int __fd, void *__buf, size_t __nbytes)
* int __fd:文件描述符
* void *__buf:存放数据
* size_t __nbytes:读取数据的长度
* 返回值:读取到数据的字节长度 成功大于0 失败-1
2.3 系统调用用于对打开的文件描述符写入内容
* ssize_t write(int __fd, const void *__buf, size_t __n)
* int __fd:模式选择
输入:STDIN_FILENO 0
输出:STDOUT_FILENO 1
错误:STDERR_FILENO 2
* const void *__buf:要写出的数据
* size_t __n:写出的长度 通常获取到读的长度
* 返回值:成功返回写出数据的长度 失败返回-1
2.4 用于在使用完成之后,关闭对文件描述符的引用
* int close(int __fd);
* int __fd:文件描述符
* 返回值:成功返回0 失败返回-1
2.5 系统调用__exit()
* 由POSIX标准定义的系统调用,用于立即终止一个进程,确保进程立即退出,不执行任何清理操作
2.6 终止当前进程
* void exit(int status);
* int status:父进程可接收到的退出状态码 0成功 非0错误
* 清理操作: 调用所有通过atexit()注册的终止处理函数
刷新所有标准I/O缓冲区(刷写缓存到文件)
关闭所有打开的标准I/O流(比如通过fopen打开的文件)
3.示例代码
3.1 标准IO
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE* filefd;
int result;
filefd = fopen("io_test.txt","r+");
if(filefd == NULL){
perror("fopen");
return 1;
}
result = fputc('a',filefd);
if(result == EOF){
perror("fputc");
return 1;
}
result = fputs("hello world",filefd);
if(result == EOF){
perror("fputs");
return 1;
}
char *str = "789";
int count = 1;
result = fprintf(filefd,"%s %d",str,count);
if(result < 0){
perror("fprintf");
return 1;
}
// 将光标移至文件前
fseek(filefd, 0, SEEK_SET);
char c;
c = fgetc(filefd);
printf("%c\n",c);
char recv_buf[1024];
char *res;
res = fgets(recv_buf,sizeof(recv_buf),filefd);
printf("%s\n",res);
fseek(filefd, 0, SEEK_SET);
char sul[20];
int rs;
rs = fscanf(filefd,"%s",sul);
if(rs == EOF){
perror("fscanf");
return 1;
}else{
printf("%s",sul);
}
result = fclose(filefd);
if(result != 0){
perror("fclose");
return 1;
}
return 0;
}
3.2 运行结果
3.3 系统调用
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
int fd;
fd = open("file_text.txt",O_CREAT | O_RDWR,0666);
if(fd < 0){
perror("open");
return 1;
}
char *str = "hello bro\n";
int len = strlen(str);
write(fd,str,len); // 写入文件
write(STDIN_FILENO,str,len); //标准输入
char buf[1024];
ssize_t wlen;
if(wlen = read(fd,buf,sizeof(buf)) > 0){
write(STDOUT_FILENO,buf,wlen); //标准输出
}
close(fd);
return 0;
}