上一篇博客我们讲解了如何使用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. map循环遍历删除

    typedef map<string,int> MapFileList; int main() { MapFileList m_SingleList; m_SingleList.inser ...

  2. java 正则表达式获取值

    @Test public void testtest() { String test = "hahahhehe sendCode\":\"12367890123rsdfs ...

  3. OCP-1Z0-051-题目解析-第28题

    28. Which two statements are true regarding constraints? (Choose two.)  A. A foreign key cannot cont ...

  4. oracle修改字符集后数据库不能启动

    最近在做修改字符集的实验,悲剧的是修改后重启,数据库启动不了. SQL> alter system set nls_language='AMERICAN'   scope = spfile; S ...

  5. swift调用相机和相册

    简单实现swift调用相机和相册的功能,分享代码与学习swift的童鞋共同进步 import UIKit class ViewController: UIViewController,UIImageP ...

  6. lseek() 定位一个已经打开的文件

    Lseek lseek()的作用是,设置文件内容的读写位置. 每个打开的文件都有一个"当前文件偏移量",是一个非负整数,用以度量从文件开始处计算的字节数.通常,读写操作都是从当前文 ...

  7. oracle的启动和关闭

    一.sql*plus方式:      用sql*plus来连接到Oracle Sqlplus /nolog 是以不连接数据库的方式启动sql*plus Connect /as sysdba 是以DBA ...

  8. cell的各种使用和赋值 总结

    cell可以分为:自定义cell,系统的cell ,cell的自适应,.xib的cell //第一种cell:系统cell 在 UIViewController下创建UITableView //1.0 ...

  9. unity针对iphone的屏幕旋转

    屏幕旋转可以在引擎里设置: 依次点开 Edit——Project Setting——Player 即可设置如图: 接下来的是 雨松大神的 代码控制,本屌是安卓机器,没能测试. C# using Uni ...

  10. MFC软件工程架构模型-模式窗口-非模式窗口

    1. SDI单文档界面: MDI多文档界面.有多个"关闭-最大化-最小化"等这样的窗口嵌套 基于对话框的软件模型 2.模式对话框和非模式对话框 模式对话框:使用DoMoel(),弹 ...