linux 标准io笔记
三种缓冲
1.全缓冲:在缓冲区写满时输出到指定的输出端. 比如对磁盘上的文件进行读写通常是全缓冲的.
2.行缓冲:在遇到'\n'时输出到指定的输出端. 比如标准输入和标准输出就是行缓冲, 回车后就会进行相应的I/O操作.
3.无缓冲:有什么就输出什么. 比如标准错误输出, 出错时立即显示出来.
设置缓冲方式的函数有两个,分别为setbuf,setvbuf
可用fflush立即输出,不管缓冲区是否达到输出标准
打开、关闭
1.FILE *fopen(const char *restrict pathname, const char *restrict type)
第一个参数为文件的路径,
第二个参数为打开的方式: r/rb只读; w/wb只写; a/ab添加; r+/ra+读写; w+/wa+读写; a+/ab+文件尾添加读写
2.int fclose(FILE *fp)
关闭打开的文件流, 释放内存
读写终止判断
读写终止分两种情况, 读写到文件尾正常终止, 读写出错返回
int feof(FILE *fp): 如果是正常终止, 函数返回非0(true)值
int ferror(FILE *fp): 如果是出错终止, 函数返回非0(true)值
每次读写一个字符
getc/fgetc/getchar
putc/fputc/putchar
getchar和putchar对应终端窗口的输入输出, 不用指定参数
getc和fgetc需要指定FILE *fp
void onechar(FILE *fp){
int ch;
while((ch=getc(fp)) != EOF){
if(putchar(ch) == EOF){
printf("output error");
exit(1);
}
}
if(ferror(fp)){
printf("file read error");
exit(1);
}
}
每次读写一行
fgets/gets
fputs/puts
gets/puts默认对应终端窗口的输入输出
注意: puts会在行尾插入添加一个'\n', 所以当我们用puts打印文件时,每行显示时都有两个'\n'(除最后一行外), 也就是每行内容下面都会有一个空行
void oneline(FILE *fp){
char buf[1024];
while(fgets(buf,MAXLINE,fp) != NULL){
if(puts(buf) == EOF){
printf("output error");
exit(1);
}
}
if(ferror(fp)){
printf("read error");
exit(1);
}
}
每次读写一个对象
这种读写方式也称为二进制方式, 由我们自己设定一次读几个字节
- size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp)
参数含义:从fp读取, 读取的内容写到ptr指向的内存, 每次读取size个字符, 一共读nobj次, 返回值为实际读取的次数 - size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp)
struct people{
char name[10];
int age;
};
void readstruct(){
struct people man;
FILE *fp;
if((fp=fopen("./test.txt","r")) == NULL){
printf("fopen error");
exit(1);
}
if(fread(&man,sizeof(struct people),1,fp) != 1){
printf("fread error");
exit(1);
}
printf("name=%s, age=%d\n",man.name,man.age);
fclose(fp);
}
void writestruct(){
struct people man;
int i;
sprintf(man.name,"charlotte");
man.age=20;
FILE *fp;
if((fp=fopen("./test.txt","w+")) == NULL){
printf("fopen error");
exit(1);
}
if(fwrite(&man,sizeof(struct people),1,fp) != 1){
printf("fwrite error");
exit(1);
}
fclose(fp);
}
跳转
创建一个文件, 然后写入一些内容, 这时文件指针在文件尾,
如果想用这个文件指针读取刚刚写入的内容, 就需要先将文件指针移动文件头部
void rewind(FILE *fp)
将文件指针移动文件头
void fseek(FILE*fp, long offset, int whence)
随意移动到哪里
whence为初步移动: SEEK_SET 移到文件头; SEEK_END 移到文件尾; SEEK_CUR 移到当前位置(不动)
offset为精调:确定了whence之后, 再移动offset个位置
临时文件
临时文件的两个特殊需求:1.文件名要唯一 2.不需要时最好能自己删除
char *tmpnam(char *ptr):
产生唯一的"路径/文件名"形式的字符串,传入的参数可以为NULL,或者长度不小于L_tmpnam的字符数组
FILE *tmpfile()
自动生成文件名并创建临时文件, 临时文件在关闭或程序退出时自动删除
如果是一次性读写可以直接调用tmpfile, 如果需要重复读写可以用tmpnam生成文件名然后手动创建和删除文件
int main(){
printf("just test: %s\n",tmpnam(NULL));
char name[L_tmpnam];
tmpnam(name);
printf("name: %s\n",name);
char buf[1024];
FILE *fp;
if((fp=tmpfile()) == NULL){
printf("tmpfile error");
exit(1);
}
fputs("one line\n",fp);
rewind(fp);
fgets(buf,1024,fp);
printf("%s",buf);
return 0;
}
linux 标准io笔记的更多相关文章
- linux标准io的copy
---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...
- Linux标准IO和管道
Linux标准IO和管道 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.标准输入和输出 程序:指令+数据 读入数据:Input 输出数据:Output 打开的文件都有一个fd: ...
- linux标准IO缓冲(apue)
为什么需要标准IO缓冲? LINUX用缓冲的地方遍地可见,不管是硬件.内核还是应用程序,内核里有页高速缓冲,内存高速缓冲,硬件更不用说的L1,L2 cache,应用程序更是多的数不清,基本写的好的软件 ...
- Linux 标准IO库介绍
1.标准IO和文件IO有什么区别? (1).看起来使用时都是函数,但是:标准IO是C库函数,而文件IO是Linux系统的API. (2).C语言库函数是由API封装而来的.库函数内部也是通过调用API ...
- [Linux]标准IO全缓冲和行缓冲
概述 标准IO中,标准错误是不带缓冲的.若是指向终端设备的流才是行缓冲的,否则是全缓冲的. 行缓冲也可以分配缓冲区,当遇到超大行(超过缓冲区的行),缓冲区内容也会优先刷出. 示例 #include & ...
- 1.Linux标准IO编程
1.1Linux系统调用和用户编程接口 1.1.1系统调用 用户程序向操作系统提出请求的接口.不同的系统提供的系统调用接口各不相同. 继承UNIX系统调用中最基本和最有用的部分. 调用按照功能分:进程 ...
- linux终端io笔记
简介 终端的两种工作模式:以行为单位的工作模式,以字符数或时间为单位自定义模式 终端判断函数: int isatty(int fd) 终端属性的获取与设置: int tcgetattr(int fd, ...
- 为什么需要标准IO缓冲?
(转)标准I/O缓冲:全缓冲.行缓冲.无缓冲 标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数.它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的 ...
- 【linux草鞋应用编程系列】_1_ 开篇_系统调用IO接口与标准IO接口
最近学习linux系统下的应用编程,参考书籍是那本称为神书的<Unix环境高级编程>,个人感觉神书不是写给草鞋看的,而是 写给大神看的,如果没有一定的基础那么看这本书可能会感到有些头重脚轻 ...
随机推荐
- css+div网页设计(三)--与多种技术的混合应用
本篇博客将介绍css与多种技术的混合应用,javascript可以为我们的页面更加方便的交互,xml使数据存储跟方便,ajax的异步更新可以加快我们网页的载入速度. 1.css与javascript ...
- 关于如何用sql语句查询出连续的一串数字
在数据库操作中,经常有一些这样的操作:插入诺干条测试数据.查询这个月的登录情况(没有登录的日期不能不存在,要显示数量为0),获取诺干条guid. 这些的基础都是怎么生成连续的一串数字 1 2 3 ...
- ServiceLoader的使用
ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内存,这是一个类声明周期的第一步(一个java类的完整的生命周期 ...
- img 元素无法获取高度的问题
项目里有这么一个功能,需要 ajax 从服务器端获取数据,然后本地生成 DOM 结构再 append 到页面上. 其中的图片是直接拿到的图像数据,而不是 url,所以据此生成 dataURI 赋值给 ...
- 【CSS3】---元素隐藏(是否占据空间、是否可点击)
在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击. { display: none; /* 不占据空间,无法点击 */ } ...
- js实现遮罩以及弹出可移动登录窗口
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【Cocos2d入门教程四】Cocos2d-x菜单篇
游戏世界多姿多彩,无论多靓丽的游戏,多耐玩的游戏,在与游戏用户交互上的往往是菜单. 上一章我们已经大概了解了导演.节点.层.精灵.这一章以菜单为主题. 菜单(Menu)包含以下内容: 1.精灵菜单项( ...
- MySQL字符集编码的理解分析
今天帮同事处理一个棘手的事情,问题是这样的: 无论在客户机用哪个版本的mysql客户端连接服务器,发现只要服务器端设置了 character-set-server = utf8之后, characte ...
- JQuery 动态添加onclick事件
$('#div_id').click(function(){ show(1,2,this); });
- 字符集转换: Ansi - Unicode
字符集转换: Ansi - Unicode wstring AnsiToUnicode (const string& strSrc ) { /*!< 分配目标空间 */ ,strSrc. ...