上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数。

1.函数介绍

fopen(打开文件)

相关函数

open,fclose

表头文件

#include<stdio.h>

定义函数

FILE * fopen(const char * path,const char * mode);

函数说明

参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。

返回值

文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。

附加说明

一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。

范例

#include<stdio.h>
main()
{
FILE * fp;
fp=fopen(“noexist”,”a+”);
if(fp= =NULL) return;
fclose(fp);
}

fgetc(由文件中读取一个字符)

相关函数

open,fread,fscanf,getc

表头文件

include<stdio.h>

定义函数

nt fgetc(FILE * stream);

函数说明

fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。

返回值

getc()会返回读取到的字符,若返回EOF则表示到了文件尾。

范例

#include<stdio.h>
main()
{
FILE *fp;
int c;
fp=fopen(“exist”,”r”);
while((c=fgetc(fp))!=EOF)
printf(“%c”,c);
fclose(fp);
}

fputc(将一指定字符写入文件流中)

相关函数

fopen,fwrite,fscanf,putc

表头文件

#include<stdio.h>

定义函数

int fputc(int c,FILE * stream);

函数说明

fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中。

返回值

fputc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。

范例

#include<stdio.h>
main()
{
FILE * fp;
char a[26]=”abcdefghijklmnopqrstuvwxyz”;
int i;
fp= fopen(“noexist”,”w”);
for(i=0;i<26;i++)
fputc(a[i],fp);
fclose(fp);
}

fflush(更新缓冲区)

相关函数

write,fopen,fclose,setbuf

表头文件

#include<stdio.h>

定义函数

int fflush(FILE* stream);

函数说明

fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中。如果参数stream为NULL,fflush()会将所有打开的文件数据更新。

返回值

成功返回0,失败返回EOF,错误代码存于errno中。

错误代码

EBADF 参数stream 指定的文件未被打开,或打开状态为只读。其它错误代码参考write()。

feof(检查文件流是否读到了文件尾)

相关函数

fopen,fgetc,fgets,fread

表头文件

#include<stdio.h>

定义函数

int feof(FILE * stream);

函数说明

feof()用来侦测是否读取到了文件尾,尾数stream为fopen()所返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0。

返回值

返回非零值代表已到达文件尾。

fclose(关闭文件)

相关函数

close,fflush,fopen,setbuf

表头文件

#include<stdio.h>

定义函数

int fclose(FILE * stream);

函数说明

fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

返回值

若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。

错误代码

EBADF表示参数stream非已打开的文件。

范例

请参考fopen()。

小试牛刀

我们先来看看我们上边讲了哪几个函数

fopen 打开文件函数

fgetc() fputc() 从文件读取或者往文件里写入一个字符

feof()  判断当前文件指针是否已经到文件末尾

fflush() 刷新文件缓冲区到文件中

fclose() 关闭文件(附带一个刷新文件缓冲区内容的操作)

流程设计:

首先输入一个数字代表创建的文件的行数n

然后输入文件的名字代表创建文件的名字name

然后我们打开文件 open()

输入n行的内容直到n行输入完毕

将文件缓冲区刷新

关闭文件

再次打开文件

统计输入文本中有字符‘a’的个数并输出出来

关闭文件

Demo实现

#include <stdio.h>

int main(void)

{

    //首先输入一个数字代表创建的文件的行数n

    int n;

    char c;

    int iCount = 0;

    //然后输入文件的名字代表创建文件的名字name

    char filename[128];

    printf("请输入文件的行数:n\n");

   scanf("%d",&n);

    printf("请输入文件的名称:filename\n");

   scanf("%s",filename);

    getchar();

    // FILE *fopen(const char*path, const char *mode);

    //然后我们打开文件 open()

    FILE* file =fopen(filename,"wb+");

    printf("文件打开成功\n");

    //输入n行的内容直到n行输入完毕

    while(n--)

    {       // int fputc(int c, FILE *stream);

           do

            {

                c = getchar();

            }

           while(fputc(c,file) !='\n');

    }

    //将文件缓冲区刷新

    fflush(file);

    //关闭文件

    fclose(file);

     printf("关闭文件\n");

    //再次打开文件

     file =fopen(filename,"rb");

    //统计输入文本中有字符‘a’的个数并输出出来

    while(!feof(file))

    {

        if(fgetc(file) == 'a')

            ++iCount;

    }

    fclose(file);

    printf("关闭文件\n");

    printf("共有%d个a\n",iCount);

    return 0;

}

平台效果

在RHEL7上

在MAC上

在Solaris上

Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解的更多相关文章

  1. Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释

     上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  2. Unix/Linux环境C编程入门教程(32) 环境变量那些事儿

    1. getenv() putenv()setenv()函数介绍 getenv(取得环境变量内容) 相关函数 putenv,setenv,unsetenv 表头文件 #include<stdli ...

  3. Unix/Linux环境C编程入门教程(1) Solaris 11 64bit环境搭建

    Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 本文就带大家来安装Solaris 11 64位并且配置好C/C++开发环境 本文所 ...

  4. Unix/Linux环境C编程入门教程(19)Red Hat Entetprise Linux 7.0环境搭建

    位架构,包括英特尔X-86_64.Power和s390.动态定时能力将降低内核内部中断数量,Open vSwitch 2.0功能可调节虚拟机之间的流量.RHEL 7中默认的文件系统是XFS,包含了一个 ...

  5. Unix/Linux环境C编程入门教程(5) Red Hat Enterprise Linux(RHEL)环境搭建

    Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 通过./a.out ./Y.out执行出结果,证明C++程序编译成功,也就说明li ...

  6. Unix/Linux环境C编程入门教程(4) Debian Linux环境搭建

    Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 1.广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,由于Deb ...

  7. Unix/Linux环境C编程入门教程(3) Oracle Linux 环境搭建

    Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 2010年9月,Oracle Enterprise Linux发布新版内核--Un ...

  8. Unix/Linux环境C编程入门教程(2) CentOS环境搭建

    Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 本文就带大家来安装CentOS并且配置好C/C++开发环境,这是一款Linux. ...

  9. Unix/Linux环境C编程入门教程(22) C/C++如何获取程序的运行时间

    1.问:知道程序运行时间我们可以做什么? 在<C++应用程序性能优化>一书中,如果大家读过相信大家一定对性能优化这一块非常上心,文中总是对优化前后的时间对比非常直观给我们一个感受. 那么我 ...

随机推荐

  1. BOT、BT、PPP形式介绍(2)

    BT1.什么是BT     BT投资是BOT的一种变换形式,即Build-Transfer(建设—转让),政府通过特许协议,引入国外资金或民间资金进行专属于政府的基础设施建设,基础设施建设完工后,该项 ...

  2. centerOS安装chkrootkit

    Chkrootkit是一个在本地系统检查rootkit痕迹的工具,它是检查系统二进制文件是否被rootkit病毒修改的一个shell脚本. (1)centerOS安装chkrootkit 安装gcc编 ...

  3. C# 二分查询

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. iphone开发之适配iphone5

    iphone5出来了,从不用适配的我们也要像android一样适配不同分辨率的屏幕了.   公司产品新版本需要适配iphone5,经过一番折腾算是搞定了.下面分享给大家:   iphone5的屏幕分辨 ...

  5. Android: 在WebView中获取网页源码

    1. 使能javascript: ? 1 webView.getSettings().setJavaScriptEnabled(true); 2. 编写本地接口 ? 1 2 3 4 5 final c ...

  6. 在 IIS 上创建 FTP 站点

    微软参考文档: 在 IIS 上生成 FTP 站点 主要过程: 1.控制面板 -> 程序 -> 启动或关闭Windows功能 -> 将Internet Information Serv ...

  7. EL 表达式中自己定义函数

    第一步: 在WEB-INF/tld/ 文件夹下创建一个func.tld文件例如以下: <taglib xmlns="http://java.sun.com/xml/ns/j2ee&qu ...

  8. NFinal 揭秘之控制器

    用NFinal框架开发的项目类似于MVC的那种开发方式,有Controller层.Model层.View层,还包括表现层Web层,在NFinal开发的项目中真正执行的代码也就是Web层中的代码,Web ...

  9. AVL树插入和删除

    一.AVL树简介 AVL树是一种平衡的二叉查找树. 平衡二叉树(AVL 树)是一棵空树,或者是具有下列性质的二叉排序树:    1它的左子树和右子树都是平衡二叉树,    2且左子树和右子树高度之差的 ...

  10. cxf的使用及安全校验-01创建简单的服务端接口

    最近因为项目的需要,研究了一下webservice的使用: 这里以cxf2.7.0为例,大致介绍一下,也用于备份啦(张立胜) 大致介绍一下项目的情况:项目有maven管理,webservice调用的方 ...