C语言文件操作之fgets()
来说一说fgets(..)函数。
原型 char * fgets(char * s, int n,FILE *stream);
參数:
s: 字符型指针,指向存储读入数据的缓冲区的地址。
n: 从流中读入n-1个字符
stream : 指向读取的流。
返回值:
1. 当n<=0 时返回NULL,即空指针。
2. 当n=1 时,返回空串"".
3. 假设读入成功,则返回缓冲区的地址。
4. 假设读入错误或遇到文件结尾(EOF),则返回NULL.
看看这个函数的官方说明:
/***
*char *fgets(string, count, stream) - input string from a stream
*
*Purpose:
* get a string, up to count-1 chars or '\n', whichever comes first,
* append '\0' and put the whole thing into string. the '\n' IS included
* in the string. if count<=1 no input is requested. if EOF is found
* immediately, return NULL. if EOF found after chars read, let EOF
* finish the string as '\n' would.
*
*Entry:
* char *string - pointer to place to store string
* int count - max characters to place at string (include \0)
* FILE *stream - stream to read from
*
*Exit:
* returns string with text read from file in it.
* if count <= 0 return NULL
* if count == 1 put null string in string
* returns NULL if error or end-of-file found immediately
*
*Exceptions:
*
*******************************************************************************/
标准库中fgets(...)的实现:
/****************************************************
char *fgets(char *s, int n, FILE *stream)
{
register int c;
register char *cs;
cs=s;
while(--n>0 &&(c = getc(stream))!=EOF)
if ((*cs++= c) =='\n')
break;
*cs ='\0';
return (c == EOF && cs == s) ?NULL :s ;
}
/********************************************************
在用fgets(..)读入数据时,先定义一个字符数组或字符指针,假设定义了字符指针 ,那么一定要初始化。
example:
char s[100]; //能够。
char *s; //不能够,由于仅仅是声明了一个指针。但并没有为它分配内存缓冲区。
所以,假设要用指针,则 char *s=(char *)malloc(100*sizeof(char)); 为其分配内存空间,c++中用char *s=new char [100]; 假设为分配内存空间,编译时不会检查出问题,但执行时会出现未知错误。。
fgets(...)读入文本行时的两种情况。
1。 假设n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回。而且在s的最后插入字符串结束标志'\0'。 而s缓冲区剩余的位置不会再填充。
example:
123abc
fgets(s,10,fp);
此时,读入七个字符,123abc\n,实际上还有最后的'\0',所以,strlen(s)=7; 假设要去除末尾的\n,s[strlen(s)-1]='\0';便可。
2. 假设n小于等于一行的字符串的长度,那么读入n-1个字符,此时并没有读入\n由于并没有到行尾 ,相同在最后会插入'\0'.
example:
123abc
char s[5];
fgets(s,5,fp);
这时读入4个字符,123a,并没有换行符,所以strlen(s)=4.
fgets(...)读入整个文件内容
通经常使用while()循环来使fges()读入文本所有内容,并按行读入。
char s[1024];
while((fgets(s,1024,fp))!=NULL)
{
printf(s);
}
当然假设n小于每行的字符个数,也能够读,仅仅只是读的次数要多。
如果一行为 : 123456789
char s[2];
int num=0;
while((fgets(s,2,fp))!=NULL)
{
printf(s);
n++;
}
每次读入一个字符, 最后也会读完一行,num=10,读了十次,所以,fgets若没遇到换行符,会接着从前一次的位置继续读入n-1个字符,仅仅要是文本流没关闭。
读入空行的情况:
第一行 abcdef123
第二行
第三行 helloworld
当中第二行为空,fget(..)会把第二行也读入,由于并未到文件结尾。
有时我们并不须要空行,能够这样做。
while((fgets(s,n,fp))!=NULL)
{
if(strlen(s)!=1) //注意这儿是1不是0,由于虽然是空行,它也会读入换行符,strlen(s)=1;
printf(s);
}
fgets(...)从标准设备读数据。
用fgets(...)还也读入标准输入设备(一般为键盘)的信息
原型 : fgets(s,n,stdin);
如果在控制台下,我们能够用fgets(...)替代gets(),读入键盘输入的信息,fgets()是安全的,由于不会像gets()有溢出的可能。。
比方 :输入 abc
fgets(s,n,stdin)也会读入n-1个字符。可是仅仅是从stdin流读入。。。
C语言文件操作之fgets()的更多相关文章
- C 语言文件操作
C 语言文件操作 1. 数据流: 程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流. 所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
- 【转】C语言文件操作解析(三)
原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...
- C语言文件操作函数大全(超详细)
C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fc ...
- go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )
go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...
- C语言文件操作
C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...
- C语言文件操作解析(五)之EOF解析(转载)
C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...
- C语言文件操作 FILE结构体
内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...
- C语言文件操作相关函数
在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...
随机推荐
- Apache Thrift的简单使用
Apache Thrift的简单使用 ---------------------- 1. 简介 Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架.它有一个代码生成器来对它所 ...
- C#超级有用的一种类型—匿名类型
顾名思义 匿名类型就是没有名字的类型.当一个新的匿名对象定义与前面已经存在的类型定义的内部变量类型同样时,编译器就会仅仅生成一个类定义,而不是各一个. 匿名类型对象中仍然能够再包括匿名对象. 在C#3 ...
- Winsock基础编程
Winsock基础编程 Socket的英文原义是"孔"或"插座".作为BSD UNIX的进程通信机制,取后一种意思.通常也称作"套接字",用 ...
- 如何使用Gmail的别名功能?
Gmail真的是一个很好的邮箱,一直是我的最爱!它有一个很独特的功能-别名,用这个功能,我们就可以把一个 邮箱当成很多个邮箱来使用了! 1.Gmail 不提供传统别名 ,但是你可以收到发送到 your ...
- Skype无法显示登录界面
Skype升级之后突然抽风,双击运行程序之后,输入用户名和密码的窗口都没了,截图如下(本机为Windows 7 32bit版本): 卸载重新安装,也无济于事.删除注册表中的Skype的相关信息后问题依 ...
- [积累]C++复习 海大2014硕士生面试题微信系统总结
好久没用C++了,正好同学有个面试题,于是就帮忙看了一下.尽管对C++的知识了解不少, 可是长期被Java浸淫, 发现这个简单的程序却也写着也不是那么顺手.好在最后还是搞定了,以下分析一下,题目例如以 ...
- 5款帮助简化的HTML5 Audio开发的Javascript类库
HTML5的audio标签提供了我们方便控制声音的功能,可是使用原生的HTML5来开发声音或者音乐相关的项目仍旧很的麻烦.在今天这篇文章中,我们将介绍5款帮助你简化开发的javascript audi ...
- Xamarin相关学习预估
以前没有开发过app也没有了解过,当然只是用过,现在迫于形势无奈活到老学到老. 初步想了下app相关开发所涉及的知识点 一 app相关资源监视 1.1 网络监视器:https://github.co ...
- COCOS2D-X之帧动画的一种实现Demo
这个Demo主要是实现帧动画,建议游戏中少用帧动画.废话少说直接上代码. 一.我们直接在COCOS2D-X自带的HelloCpp的工程中添加代码即可.我们在初始化中添加如下代码并附上图片资源. CCS ...
- <一年成为Emacs高手>更新到20130706版
这次更新比较多,加了第三方精品插件推荐,添加了我认为不错的Emacs社区. 见 原文