三种缓冲

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笔记的更多相关文章

  1. linux标准io的copy

    ---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...

  2. Linux标准IO和管道

    Linux标准IO和管道 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.标准输入和输出 程序:指令+数据 读入数据:Input 输出数据:Output 打开的文件都有一个fd: ...

  3. linux标准IO缓冲(apue)

    为什么需要标准IO缓冲? LINUX用缓冲的地方遍地可见,不管是硬件.内核还是应用程序,内核里有页高速缓冲,内存高速缓冲,硬件更不用说的L1,L2 cache,应用程序更是多的数不清,基本写的好的软件 ...

  4. Linux 标准IO库介绍

    1.标准IO和文件IO有什么区别? (1).看起来使用时都是函数,但是:标准IO是C库函数,而文件IO是Linux系统的API. (2).C语言库函数是由API封装而来的.库函数内部也是通过调用API ...

  5. [Linux]标准IO全缓冲和行缓冲

    概述 标准IO中,标准错误是不带缓冲的.若是指向终端设备的流才是行缓冲的,否则是全缓冲的. 行缓冲也可以分配缓冲区,当遇到超大行(超过缓冲区的行),缓冲区内容也会优先刷出. 示例 #include & ...

  6. 1.Linux标准IO编程

    1.1Linux系统调用和用户编程接口 1.1.1系统调用 用户程序向操作系统提出请求的接口.不同的系统提供的系统调用接口各不相同. 继承UNIX系统调用中最基本和最有用的部分. 调用按照功能分:进程 ...

  7. linux终端io笔记

    简介 终端的两种工作模式:以行为单位的工作模式,以字符数或时间为单位自定义模式 终端判断函数: int isatty(int fd) 终端属性的获取与设置: int tcgetattr(int fd, ...

  8. 为什么需要标准IO缓冲?

    (转)标准I/O缓冲:全缓冲.行缓冲.无缓冲 标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数.它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的 ...

  9. 【linux草鞋应用编程系列】_1_ 开篇_系统调用IO接口与标准IO接口

    最近学习linux系统下的应用编程,参考书籍是那本称为神书的<Unix环境高级编程>,个人感觉神书不是写给草鞋看的,而是 写给大神看的,如果没有一定的基础那么看这本书可能会感到有些头重脚轻 ...

随机推荐

  1. Oracle基础 exp/imp和expdp/impdp的区别:

    一.exp/imp和expdp/impdp在功能上的区别: 1.把用户usera的对象导入到userb emp/imp用法: formuser=usera touser=userb; empdp/im ...

  2. 改成 否“依然报LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”问题的解决

    LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 . 这个bug说实话,还是挺让人蛋疼的!!! 问题发生原因: 我这里能跑2013+opencv24 ...

  3. Windows 7 无线网络故障

    朋友打电话来问为何他的PC不能连接到家里的无线网络,而手机等其他设备都可以?相互交谈之中,我问如下几个问题: 是否可以搜索到其他无线网络? 答:是.(想确实无线网卡工作是否正常) 新的手机是否可以连接 ...

  4. web前端开发学习指南(大群主推荐)

    http://www.ituring.com.cn/book/1140 http://www.ituring.com.cn/book/1361

  5. 数理方程:Fourier变换与卷积

    更新:1 APR 2016 关于傅里叶级数参看数理方程:Fourier级数 Fourier变换: 对于满足Dirichlet条件的函数\(f(t)\)在其连续点处定义 \(F(\omega)=\int ...

  6. MongoDB - MongoDB CRUD Operations, Query Documents, Project Fields to Return from Query

    By default, queries in MongoDB return all fields in matching documents. To limit the amount of data ...

  7. MongoDB - The mongo Shell, Access the mongo Shell Help

    In addition to the documentation in the MongoDB Manual, the mongo shell provides some additional inf ...

  8. JS 操作JSON字符串

    用Js的eval解析JSON中的注意点 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eva ...

  9. 谷歌浏览器Chrome不再支持showModalDialog的解决办法

    问题重现 弹出窗口编码: JavaScript 0 1 2 3 4 5 6 7   var obj = new Object();   var retval = window.showModalDia ...

  10. 理解C#系列 / 核心C# / 判断&循环&跳转

    判断&循环&跳转 说明 本节写的是C#语言的控制程序流的语句,“控制程序流”就是控制程序运行流程的意思. 判断 很容易理解:如果……就…… if语句:测试特定条件是否满足,如果满足就执 ...