• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言fgetc和fputc函数用法详解(以字符形式读写文件)

C语言fgetc和fputc函数用法详解(以字符形式读写文件)

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2022-04-30

匿名通过本文主要向大家介绍了等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
在C语言中,读写文件比较灵活,既可以每次读写一个字符,也可以读写一个字符串,甚至是任意字节的数据(数据块)。本节介绍以字符形式读写文件。

以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符。主要使用两个函数,分别是 fgetc() 和 fputc()。

字符读取函数 fgetc

fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符。fgetc() 的用法为:
int fgetc (FILE *fp);
fp 为文件指针。fgetc() 读取成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF。

EOF 是 end of file 的缩写,表示文件末尾,是在 stdio.h 中定义的宏,它的值是一个负数,往往是 -1。fgetc() 的返回值类型之所以为 int,就是为了容纳这个负数(char不能是负数)。
EOF 不绝对是 -1,也可以是其他负数,这要看编译器的实现。
fgetc() 的用法举例:
char ch;FILE *fp = fopen("D:\\demo.txt", "r+");ch = fgetc(fp);
表示从D:\\demo.txt文件中读取一个字符,并保存到变量 ch 中。

在文件内部有一个位置指针,用来指向当前读写到的位置,也就是读写到第几个字节。在文件打开时,该指针总是指向文件的第一个字节。使用 fgetc() 函数后,该指针会向后移动一个字节,所以可以连续多次使用 fgetc() 读取多个字符。

注意:这个文件内部的位置指针与C语言中的指针不是一回事。位置指针仅仅是一个标志,表示文件读写到的位置,也就是读写到第几个字节,它不表示地址。文件每读写一次,位置指针就会移动一次,它不需要你在程序中定义和赋值,而是由系统自动设置,对用户是隐藏的。

【示例】在屏幕上显示 D:\\demo.txt 文件的内容。
#include<stdio.h>int main(){    FILE *fp;    char ch;       //如果文件不存在,给出提示并退出    if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){        puts("Fail to open file!");        exit(0);    }    //每次读取一个字节,直到读取完毕    while( (ch=fgetc(fp)) != EOF ){        putchar(ch);    }    putchar('\n');  //输出换行符    fclose(fp);    return 0;}
在D盘下创建 demo.txt 文件,输入任意内容并保存,运行程序,就会看到刚才输入的内容全部都显示在屏幕上。

该程序的功能是从文件中逐个读取字符,在屏幕上显示,直到读取完毕。

程序第 13 行是关键,while 循环的条件为(ch=fgetc(fp)) != EOF。fget() 每次从位置指针所在的位置读取一个字符,并保存到变量 ch,位置指针向后移动一个字节。当文件指针移动到文件末尾时,fget() 就无法读取字符了,于是返回 EOF,表示文件读取结束了。

对 EOF 的说明

EOF 本来表示文件末尾,意味着读取结束,但是很多函数在读取出错时也返回 EOF,那么当返回 EOF 时,到底是文件读取完毕了还是读取出错了?我们可以借助 stdio.h 中的两个函数来判断,分别是 feof() 和 ferror()。

feof() 函数用来判断文件内部指针是否指向了文件末尾,它的原型是:
int feof ( FILE * fp );
当指向文件末尾时返回非零值,否则返回零值。

ferror() 函数用来判断文件操作是否出错,它的原型是:
int ferror ( FILE *fp );
出错时返回非零值,否则返回零值。

需要说明的是,文件出错是非常少见的情况,上面的示例基本能够保证将文件内的数据读取完毕。如果追求完美,也可以加上判断并给出提示:
#include<stdio.h>int main(){    FILE *fp;    char ch;      //如果文件不存在,给出提示并退出    if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){        puts("Fail to open file!");        exit(0);    }    //每次读取一个字节,直到读取完毕    while( (ch=fgetc(fp)) != EOF ){        putchar(ch);    }    putchar('\n');  //输出换行符    if(ferror(fp)){        puts("读取出错");    }else{        puts("读取成功");    }    fclose(fp);    return 0;}
这样,不管是出错还是正常读取,都能够做到心中有数。

字符写入函数 fputc

fputc 是 file output char 的所以,意思是向指定的文件中写入一个字符。fputc() 的用法为:
int fputc ( int ch, FILE *fp );
ch 为要写入的字符,fp 为文件指针。fputc() 写入成功时返回写入的字符,失败时返回 EOF,返回值类型为 int 也是为了容纳这个负数。例如:
fputc('a', fp);
或者:
char ch = 'a';fputc(ch, fp);
表示把字符 'a' 写入fp所指向的文件中。

两点说明

1) 被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,并将写入的字符放在文件开头。如需保留原有文件内容,并把写入的字符放在文件末尾,就必须以追加方式打开文件。不管以何种方式打开,被写入的文件若不存在时则创建该文件。

2) 每写入一个字符,文件内部位置指针向后移动一个字节。

【示例】从键盘输入一行字符,写入文件。
#include<stdio.h>int main(){    FILE *fp;    char ch;    //判断文件是否成功打开    if( (fp=fopen("D:\\demo.txt","wt+")) == NULL ){        puts("Fail to open file!");        exit(0);    }    printf("Input a string:\n");    //每次从键盘读取一个字符并写入文件    while ( (ch=getchar()) != '\n' ){        fputc(ch,fp);    }    fclose(fp);    return 0;}
运行程序,输入一行字符并按回车键结束,打开D盘下的 demo.txt 文件,就可以看到刚才输入的内容。

程序每次从键盘读取一个字符并写入文件,直到按下回车键,while 条件不成立,结束读取。
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28C++实现下载的代码
  • 2017-12-08C++实现插入排序
  • 2017-05-28简单掌握C++编程中的while与do-while循环语句使用
  • 2017-05-28基于重启后消失的注册表键值的详细介绍
  • 2017-05-28C++ boost 时间与日期处理详细介绍
  • 2017-05-28VC++中内存对齐实例教程
  • 2017-05-28详谈全排列next_permutation() 函数的用法(推荐)
  • 2022-04-30C语言数组指针(指向数组的指针)详解
  • 2017-05-28C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
  • 2017-05-28C语言实现最大间隙问题实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言编程中的联合体union入门学习教程
    • 探讨C语言中关键字volatile的含义
    • WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解
    • C语言socket编程开发应用示例
    • 使用C语言构建基本的二叉树数据结构
    • c文件汇编后函数参数传递的不同之处
    • 关于c++ 智能指针及 循环引用的问题
    • C语言fgets和fputs函数的用法详解(以字符串的形式读写文件)
    • 深入解读C++中的右值引用
    • 关于大小端、位域的一些概念详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有