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语言 文件操作8--fputs()和fgets()
//fputs()和fgets() #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...
- Node.js文件操作一
Node.js和其他语言一样,也有文件操作.先不说node.js中的文件操作,其他语言的文件操作一般也都是有打开.关闭.读.写.文件信息.新建删除目录.删除文件.检测文件路径等.在node.js中也是 ...
- C语言文件操作相关函数
在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...
- 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语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...
- Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解
上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...
- Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释
上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...
- 关于C语言文件操作
关于C语言的文件操作之前我也写过一篇博客来介绍,但是当时写的很不全面,只是简单的使用了一下 ,今天再从新学习一下. 1.文件的写 首先还是先看一个简单的例子: include<stdio.h&g ...
随机推荐
- Android学习笔记之View(二)
View加载的流程之测量:rootView调用measure()→onMeasure(): measure()是final方法,表明Android不想让开发者去修改measure的框架,开发者可以on ...
- BZOJ 3477: [Usaco2014 Mar]Sabotage( 二分答案 )
先二分答案m, 然后对于原序列 A[i] = A[i] - m, 然后O(n)找最大连续子序列和, 那么此时序列由 L + mx + R组成. L + mx + R = sum - n * m, s ...
- [置顶] 深入浅出MongoDB(三)环境搭建
上次的博文深入浅出MongoDB(二)概述中我们已经将MongoDB的相关概念讲解了一下,接下来我们继续进行MongoDB学习.在学习之前,大家首先需要在自己的电脑上安装MongoDB. 1.安装 安 ...
- 第三方系统打开EAFC的实现
前言:EAFC是我们公司的一个框架,一个项目上,客户的OA系统要调用我们推送过去的代办任务,希望能打开我们的代办处理界面,我们的代办处理界面是winform的.引出给出了以下的一个方案.在此备存. - ...
- 【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
原文 [译]在Asp.Net中操作PDF - iTextSharp - 使用字体 紧接着前面我对iTextSharp简介博文,iTextSharp是一个免费的允许Asp.Net对PDF进行操作的第三方 ...
- python binary lib on win/各种python库的二进制包
虽然很不愿意在windows上折腾python,但有时linux不在身边的时候还得在windows上写代码.很久之前找到这个地址,后来忘了,今天搜了半天才把它找到,所以记录一下. http://www ...
- JAVA_2Lesson
package test; public class abc { public static void main(String[] arg) { int[][] xx=new int[3][]; xx ...
- android内存的一点优化
android手机给应用分配的内存通常是8兆左右,如果处理内存处理不当很容易造成OutOfMemoryError,我们的产品出现最多的错误也是OutOfMemoryError的异常, 在解决这个异常时 ...
- PHP - 拒绝低版本PHP
//判断PHP版本是否太低 if (PHP_VERSION < '4.1.0') { echo 'Version is to Low!'; exit; }
- 二维码闪电登录流程详解,附demo(2/2)
上篇文章,我们重点介绍了一下二维码登录的流程,以及每个“角色”要做的事情,下面我们重点分析TV角色所做的工作. TV主要完成二维码图片显示,以及websocket请求.下面重点说一下这两点. 1. B ...