目录
4.5 fgetc/fputc(功能:从文件读取/写入一个字符串)
1. IO的概念理解
#include<stdio.h> //其中的的stdio 便是我们经常使用的IO,这个属于系统IO
2. IO的分类
2.1 标准IO(库函数) //上方的举例便属于标准IO
printf scanf fopen fread fwrite fclose fgetc fputc fgets fputs.都属于标准IO
2.2 文件IO(系统调用)
open read write close都属于文件IO
系统调用和库函数分别是什么:系统调用是用户访问内核空间的一个过程,效率比较低,每次系统调用都要从用户空间到内核空间调用一次内核。而库函数相当于系统调用+缓冲区实现的,可移植性比较强,执行效率高。
3. FIEL结构体
3.1 FIEL结构体用来描述打开的文件的,只要打开一个文件,就会产生FIEL结构体,在一个已经运行的程序中默认产生三个FILE结构体:
//三个FIEL结构体
stdin:标准输入
stdout:标准输出
stderr:标准出错
4. IO接口函数(标准IO)
4.1 fopen( 功能:打开一个文件)
功能、参数、返回值如下:
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
功能:打开一个文件
参数: @pathname:文件的路径及文件的名字(字符指针)
@mode:打开文件的方式
r: 以只读的方式打开文件,将光标定位在文件的开头
r+: 以读写的方式打开文件,将光标定位在文件的开头
w: 以只写的方式打开文件,如果文件不存在创建文件,
如果文件存在清空文件,将光标定位在文件的开头
w+: 以读写的方式打开文件,如果文件不存在创建文件,
如果文件存在清空文件,将光标定位在文件的开头
a:以只写的方式打开文件,如果文件不存在就创建,
如果文件存在将光标定位在文件的结尾
a+:以读写的方式打开文件,如果文件不存在就创建,
如果文件存在写在结尾写,如果文件存在读在开头读
返回值:成功返回FILE的指针,失败返回NULL,置位错误码
fopen使用示例:
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp;
//以只写的方式打开文件,如果文件不存在就创建文件
// ./test.txt 文件的路径和文件的名字
//"r" 权限
fp = fopen("./test.txt","r");
if(fp == NULL){
printf("open file error\n");
return -1;
}
printf("open file success\n");
return 0;
}
4.2 fclose(功能:关闭一个文件)
功能、参数、返回值如下:
#include <stdio.h>
int fclose(FILE *stream);
功能:关闭文件
参数:@stream:文件指针
返回值:成功返回0,失败返回-1(EOF),置位错误码
fclose示例:
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp;
//以只写的方式打开文件,如果文件不存在就创建文件
//“./test.txt”文件的路径和文件的名字
//"w" 权限
fp = fopen("./test.txt","w");
if(fp == NULL){
printf("open file error\n");
return -1;
}
printf("open file success\n");
//关闭文件
if(fclose(fp)){
printf("close file error\n");
return -1;
}
fclose(stdin);
fclose(stdout);
fclose(stderr);
return 0;
}
4.3 strerror(根据错误码返回错误信息)
功能、参数、返回值如下:
#include <string.h>
char *strerror(int errnum);
功能:根据错误码,转换出来错误信息
参数:@errnum:错误码
返回值:错误信息
strerror示例:
#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno;
int main(int argc, char const *argv[])
{
FILE *fp;
fp = fopen("./test.txt","r");
if(fp == NULL){
printf("errno = %d\n",errno);
//将错误信息通过printf打印出来
printf("%s\n",strerror(errno));
printf("open file error\n");
return -1;
}
printf("open file success\n");
return 0;
}
错误码原理:fopen会调用底层的sys_open,sys_open执行失败时将程序的错误码传递给errno的变量,可以通过这个变量获取到底层的错误。
4.4 perror(功能:打印错误信息)
功能、参数、返回值如下:
void perror(const char *s);
功能:直接打印错误信息 (自动加上'\n')
参数:@s:用户附加的错误信息
返回值:无
perror示例:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(int argc, char const *argv[])
{
FILE *fp;
fp = fopen("./test.txt","r");
if(fp == NULL){
perror("open file");
return -1;
}
printf("open file success\n");
return 0;
}
4.5 fgetc/fputc(功能:从文件读取/写入一个字符串)
功能、参数、返回值:
int fgetc(FILE *stream);
功能:从文件中读取一个字符
参数:
@stream:FILE的结构体指针
返回值:成功返回读取到字符的ascii码,失败返回EOF(-1)
//--------------------------------------------------------------------------------------
int fputc(int c, FILE *stream);
功能;向文件中写一个字符
参数:
@c:被写的字符
@stream:FILE指针
返回值:成功返回读取到字符的ascii码,失败返回EOF(-1)
fgetc/fputc示例:
#include <stdio.h>
#define PRINT_ERR(msg) do{ \
perror(msg);\
return -1;\
}while(0)
int main(int argc, char const *argv[])
{
char ch;
FILE *fp;
//1.打开文件
fp = fopen("./hello.txt","r");
if(fp == NULL)
PRINT_ERR("open error");
//2.读取文件中的字符
ch = fgetc(fp);
printf("ch = %c\n",ch);
//3.关闭文件
fclose(fp);
return 0;
}
#include <stdio.h>
#define PRINT_ERR(msg) do{ \
perror(msg);\
return -1;\
}while(0)
int main(int argc, char const *argv[])
{
FILE*fp;
//1.参数检查
if(argc != 2){
printf("input error,try again\n");
printf("usage: ./a.out filename\n");
return -1;
}
//2.打开文件
if((fp = fopen(argv[1],"w+")) == NULL)
PRINT_ERR("open file error");
//3.向文件中写入hello
fputc('h',fp);
fputc('e',fp);
fputc('l',fp);
fputc('l',fp);
fputc('o',fp);
//4.关闭文件
fclose(fp);
return 0;
}
5. 标准IO缓冲区
5.1 缓冲区的大小
全缓存:文件的缓冲区就是全缓存,大小是4096
行缓存:和终端相关的相关缓冲区就是行缓存(stdin stdout),大小就是1024
不缓存:没有缓冲区(stderr),大小就是0
5.2 行缓存刷新机制
1.行缓存在遇到‘\n’的时候会刷新缓冲区
2.行缓存在在程序结束的时候,也会刷新缓冲区
3.标准输入和标准输出发生切换的时候也会刷新缓冲区
4.当文件关闭的时候也会刷新缓冲区
5.当主动调用fflush的时候也会刷新缓冲区
6.当行缓存满的时候刷新缓冲区,如果多于1024个字符,再次被放入缓冲区中
5.3 全缓存刷新机制
1.程序结束会刷新缓冲区
2.遇到fclose(fp)会刷新缓冲区
3.输出和输入切换的时候也会刷新缓冲区
4.fflush(fp)也会刷新缓冲区
5.缓冲区满也会刷新缓冲区(4096)
5.4 主动刷新缓冲区
int fflush(FILE *stream);
功能:主动刷新缓冲区
参数:
@stream:文件指针
返回值:成功返回0,失败返回EOF并置位错误码
今天的文章io进程测试题_buffer io error on dev分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87577.html