以下函数用于打开和关闭一个流。
#include <stdio.h>
FILE * fopen (const char *pathname, const char *opentype);
int fclose (FILE *stream);
FILE * freopen (const char *pathname, const char *opentype, FILE *stream);

fopen()打开由pathname指定的文件并创建一个与之相连的流。如果该文件不存在,则创建一个新文件。如果打开文件成功,它返回指向此流的指针,否则返回空指针NULL。
 
opentype参数是一字符串,它控制文件打开的方式,其值只能是下述字符串之一:

"r":为读而打开一个已存在的文件,文件位置定位于文件开始。

"w":为写而打开一个文件。如果文件存在,则将它的长度截为0,也即文件将被重新写过;如果文件不存在,则创建一个新文件。

"a":为在文件尾添加内容而打开文件。若文件存在,原来的内容不变且输出添加在文件的末尾;否则,创建一个新文件。

"r+":为更新(既读又写)而打开一个已存在的文件,文件原有内容不变,文件位置定位于文件开始。

"w+":为更新(既读又写)而打开一个文件,若文件已存在,其长度被截至0;否则,创建一个新文件。

"a+":为更新(既读又写)而打开一个文件,若文件已存在,原内容不变;否则,创建一个新文件。用于读的初始文件位置定位于文件开始,但输出总是添加在文件的末尾。
其中,字母r、w和a分别代表read、write和append。字符“+”指明为更新而打开一个文件,当以这种方式打开一个文件时,对它既可写也可读。

以添加方式("a"或"a+"方式)打开的文件,不管文件的当前位置如何,所写出的数据总是顺序地附加在文件的末尾,因此不可能覆盖文件原来的内容。其文件位置只用于控制从文件中读数据。

打开的流通过调用fclose()来关闭。fclose()关闭参数stream指定的流,并中断与对应文件的连接。在流被关闭之前,所有缓冲的输出将被写出。关闭一个流后就不能再对它进行任何操作。

fclose()调用成功返回0,否则返回EOF并置errno指明错误。

当调用fclose()关闭一输出流时,对错误情形进行检查很重要,因为此时可能检测到真实的错误。例如,当fclose()将缓冲区中剩余的数据写出时,它可能得到磁盘空间已满的错误,如果不检测的话,就有可能丢失文件的内容。

进程从main()退出或调用exit()正常终止时(5.4节),所有打开的流都将自动被关闭。但为了确保输出数据的完整性,编写程序时仍然应当在进程结束前明显地调用fclose()。因为当进程以其他非正常方式终止时,例如调用abort()流产程序(5.4.3节)或由于致命信号(7.2节),文件没有正常关闭,输出缓冲区中的数据将不会被写出,从而可能导致文件不完整。2.7节会更详细地讲述流缓冲的问题。

freopen()重新打开pathname指定的文件,它的作用类似于fclose()和fopen()的合并。如果stream指定的流是打开的,它首先关闭该流,忽略任何错误,然后按opentype所给方式如同fopen()一样打开参数pathname指定的文件,并使之与stream给定的同一个流相连。freopen()调用成功返回指向流的指针,否则返回NULL并置errno指明错误。

freopen()一般用于连接标准流stdin、stdout、stderr至一个我们选择的文件。它对那种难以对标准流进行编程的程序很有用。

下面给出两个例子用于说明

1.fopen和fclose函数的使用方法

 #include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
int iflag;
if(argc<=)
{
printf("usage: %s filename\n",argv[]);
return ;
}
fp=fopen(argv[],"r");
if(fp==NULL)
{
printf("Open file %s failed!", argv[]);
return ;
}
printf("Open file %s successfully!\n",argv[]);
iflag=fclose(fp);
if(iflag==)
{
printf("Close file %s successfully!\n",argv[]);
return ;
}
else
{
printf("Close file %s failed! ", argv[]);
return ;
}
}

2.fcloseall函数的使用方法

 #include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp1, *fp2;
if((fp1=fopen("file1.txt","w"))==NULL)
{
printf("Open file1.txt failed!\n");
return ;
}
if((fopen("file2.txt","w"))==NULL)
{
printf("Open file2.txt failed!\n");
return ;
}
if(fcloseall()==EOF)
{
printf("close fil1.txt file2.txt failed!\n");
return ;
}
else
printf("streams closed successfully!\n");
return ;
}

下面介绍“读和写流”

流与缓冲    

   流I/O是由C语言的标准函数提供的,这些I/O可以替代系统中提供的read和write函数。事实上流I/O的内部封装了这两个基本的文件读写系统调用。使用流I/O在某些程度上来讲要方便一些,这些I/O在效率上没有特别大的差异。

        基于流的操作最终会调用read或者write函数进行操作。为了使程序的运行效率最高,流对象通常会提供缓冲区,以减少调用系统I/O库函数的次数。

        基于流的I/O提供以下2种缓冲:

1,全缓冲:直到缓冲区填满,才调用系统I/O函数。对于读操作来说,直到读入的内容的字节数等于缓冲区大小或者文件以经到达结尾,才进行I/O操作将外存文件内容读入缓冲区;对于写操作来说,直到缓冲区填满,才进行实际的I/O操作将缓冲区内容写到外存文件中。磁盘文件通常是全缓冲的。

2,行缓冲:直到遇到换行符\n才调用系统I/O函数。对于读操作来说,遇到换行符\n才进行I/O操作,将所读内容写入缓冲区;对于写操作来说,遇到换行符\n才进行I/O操作,将缓冲区内容写到外存。由于缓冲区大小是有限制的,所以当缓冲区填满时即使没有遇到\n,也同样会进行实际的I/O操作。标准输入stdin和标准输出stdout都默认是行缓冲的。

3,无缓冲:灭有缓冲区,数据会立即读入或者输出到外存文件和设备上。标准出错stderr是无缓冲的,这样也能保证错误提示和输出能及时地反馈给用户,供用户排除错误。

 

以字符为单位读写数据

       每次读写一个字符数据的I/O方式称为每次一个字符的I/O。Linux下使用fgetc函数获得一个字符,其函数原型如下:

             #include<stdio.h>

             int fgetc(FILE*fp);

函数如果执行成功则返回该字符的ASCLL值,如果执行失败,则返回EOF。

Linux环境下使用fputc函数输出一个字符数据,函数原型如下:

#include<stdio.h>

int fputc(int c,FILE*fp)

第一个参数表示想要输出的字符的ASCLL值(源),第二个参数表示想要输出的文件流(目的地)。

 

以行为单位读写数据

      当输入内容遇到\n时则将流中\n之前的内容送到缓冲区中的I/O方式称为每一次行的I/O。Linux使用下列函数提供一次读入一行的功能。

#include<stdio.h>

char*fgets(char *restrict buf,int n,FILE*restrict fp);

char*gets(char*);

fgets函数的第一个参数表示存放读入的缓冲区,第二个参数n表示读入的字符个数,此参数的最大值不能超过缓冲区的长度。fgets函数一直读,直到遇到\n为止,如果在n-1个字符內未遇到换行符,则只读入n-1个字符。最后一个字符用于存储字符串结束标志\0.需要注意的是fgets函数会将‘\n’换行符也读进缓冲区中,因此缓冲区的实际有效内容应该是缓冲区实际字节数(不包括‘\0’)减1.fgets函数的第三个参数是需要读入的流对象。

          fgets函数的换回值有以下两种情况:1,成功读取一行,返回缓冲区的首地址。2,读取出错或者文件已经到达结尾则返回NULL。

gets函数和fgets函数类似,该函数从标准输入流中读取一行并将其存入一个缓冲区,并不将‘\n’读进缓冲区中。gets函数的返回值和fgets相同。

       Linux 环境下用fputs函数和puts函数实现输出一行字符串,其函数原型如下:

#include<stdio.h>

int fputs(const char*restrict str,FILE *restrict fp);

int puts(const char*str);

fputs函数的第一个参数表示存放输出内容的缓冲区,第二个参数表示要输出的文件。如果执行成功则返回输出的字节数,失败返回-1。puts函数用与向标准输出输出一行字符串,其参数和fputs函数的第一个参数相同,如果成功输出,则返回输出的字节数,失败则返回-1,值得注意的是,虽然gets函数不读入\n,但是puts函数却输出\n。fputs和puts函数都不输出字符串的结束符‘\0’。对于I/O来说,fputs函数和fgets函数的搭配是安全又可靠的。

下面给出两个实例

1.字符读写

 #include <stdio.h>

 #define BEGIN 1;

 int main(int argc, char *argv[])
{
int c, characters, lines, words, state;
state=;
characters=words=lines=;
while((c=getchar())!='')
{
characters++;
switch(c)
{
case '\n':
lines++;
state=;
break;
case ' ':
state=;
break;
case '\t':
state=;
break;
default:
if(state==)
{
state=BEGIN;
words++;
}
break;
}
}
printf("Thereis %d characters, %d words ,%d lines.\n",characters, words, lines); }

2.行读写

 #include <stdio.h>
int main(int argc , char *argv[])
{
char buf[];
FILE *fp;
if(argc<=)
{
printf("usage: %s filename\n",argv[]);
return ;
}
if((fp=fopen(argv[], "r"))==NULL)
{
printf("File open error. \n");
return ;
}
while((fgets(buf,,fp))!=)
puts(buf);
return ;
}

Linux C编程--打开和关闭流的更多相关文章

  1. 标准I/O库之打开和关闭流

    下列三个函数打开一个标准I/O流. #include <stdio.h> FILE *fopen( const char *restrict pathname, const char *r ...

  2. Linux coredump 的打开和关闭

    (转载自 http://blog.sina.com.cn/s/blog_6b3765230100lazj.html) ulimit -c 输出如果为0,则说明coredump没有打开 ulimit - ...

  3. 【Linux网络编程】基于TCP流 I/O多路转接(poll) 的高性能http服务器

    服务器比较简陋,为了学习poll的使用,只向客户端回写一条html语句.启动服务器后,浏览器发起请求,服务端向浏览器写回html,响应字符串,然后可以看到,浏览器解析并显示 Hello Poll!. ...

  4. linux编程 fmemopen函数打开一个内存流 使用FILE指针进行读写访问

    fmemopen()函数打开一个内存流,使你可以读取或写入由buf指定的缓冲区.其返回FILE*fp就是打开的内存流,虽然仍使用FILE指针进行访问,但其实并没有底层文件(并没有磁盘上的实际文件,因为 ...

  5. C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

    迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...

  6. Linux C 文件与目录2 文件的打开与关闭

    文件的打开与关闭 open和close 文件的打开指的是从磁盘中找到一个文件,返回一个整形的打开文件顺序的编号.打开的文件处于可读.可写状态.文件的关闭指的是释放打开的文件,是文件处于不可读写的状态. ...

  7. 【linux命令】打开关闭防火墙iptables

    防火墙关闭 关闭防火墙(linux) 经过自己的实验,发现在ubuntu中service iptables 无法使用. 同时,在init.d中并没有iptables的程序,iptables程序在/sb ...

  8. 【linux草鞋应用编程系列】_5_ Linux网络编程

    一.网络通信简介   第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章.   二.linux网络通信     在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...

  9. storysnail的Linux串口编程笔记

    storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...

随机推荐

  1. javascript --学习this

    this 在一般的强类型语言中,this指向的是这个对象本身,可在javascript中 this的取值是执行上下文环境的一部分 其实这个this并不是很难立即,只要记住二点就可以了 那就是谁call ...

  2. python的一些总结5

    上面4都是水的 恩每篇都一点知识点 用来写给不耐烦的人看..哈哈这篇 争取不水. 上面4篇如果 掌握 基本上是 80%常用的代码了. 1.下面讲一下 比较常用的代码: macro(jinja 上的功能 ...

  3. seajs 2.3.0 加入jquery

    [前言] 上篇文章简单的介绍了seajs的使用,下午使用seajs整合jquery就碰到问题了. 下载seajs上的examples,里面直接require('jquery')没有不论什么问题, 我照 ...

  4. 通过缓存数据库结果提高PHP性能(转)

    众所周知,缓存数据库查询的结果可以显著缩短脚本执行时间,并最大限度地减少数据库服务器上的负载.如果要处理的数据基本上是静态的,则该技术将非常有效.这是因为对远程数据库的许多数据请求最终可以从本地缓存得 ...

  5. 互联网常见Open API文档资源

    原文地址:http://blog.sina.com.cn/s/blog_4d8713560100y272.html 所谓的开放API(OpenAPI)是服务型网站常见的一种应用,网站的服务商将自己的网 ...

  6. C++编译器默默编写并调用哪些函数

    什么时候empty class(空类)不再是个empty class呢?当C++处理过它之后,是的,如果你自己没有声明,编译器就会为它声明(编译器版本)一个copy构造函数.一个copy assign ...

  7. Link List

    At first, i prepared to go through <the introduction to algorithm> ,however , i found some par ...

  8. Expectation Maximization and GMM

    Jensen不等式 Jensen不等式给出了积分的凸函数值必定大于凸函数(convex)的积分值的定理.在凸函数曲线上的任意两点间连接一条线段,那么线段会位于曲线之上,这就是将Jensen不等式应用到 ...

  9. PS将图标变灰

    方法一:直接去色,图像——调整——去色:快捷键ctrl+shift+U 方法二:图像——调整——灰白:快捷键shift+ctrl+alt+B;

  10. IIS 允许无后缀文件访问的配置

    最近一个项目 前端开发用了一大堆无后缀的html模板,问题就是发布到IIS以后访问 模板文件报404错误.无法下载. 百度 谷歌 搜一堆 都是MIME里添加 '.*' 实际上无效 正解是: MIME里 ...