fgets(string,int,fp)

回车读入测试

 #include <stdio.h>
int main()
{
FILE *fp;
char ch1[],ch2[],ch3[],ch4[];
fp=fopen("case1.in","r");
fgets(ch1,,fp);
fseek(fp,,);
fgets(ch2,,fp);
fseek(fp,,);
fgets(ch3,,fp);
fseek(fp,,);
fgets(ch4,,fp);
fseek(fp,,);
printf("10:%s;\n",ch1);
printf("11:%s;\n",ch2);
printf("12:%s;\n",ch3);
printf("13:%s;\n",ch4);
fclose(fp);
return ;
}

case1.in内容:

ottffssent
abcdefghij
kl

运行结果:

10:ottffssen;
11:ottffssent;
12:ottffssent
;
13:ottffssent
;

结论:

字符串要留空位给'\0',如果有回车的话要再预留空位给回车'13',即字符数量为10的字符串则用fgets时要取n=12

如果fgets中n的数量过少而读不入回车,会导致输出时没有换行

如果fgets中n的数量过多,那么回车已经停止了读入字符了,即回车符后紧跟'\0'

空格读入测试

代码同上

case1.in有修改:

ottff sent
abcde ghij
kl

运行结果:

10:ottff sen;
11:ottff sent;
12:ottff sent
;
13:ottff sent
;

结论:

空格被视为普通字符处理,不能中止字符的读入.而回车可以


代码增加一点

     fscanf(fp,"%s",ch5);
fscanf(fp,"%s",ch6);
fscanf(fp,"%s",ch7);
fscanf(fp,"%s",ch8);
printf("fscanf1:%s;\n",ch5);
printf("fscanf2:%s;\n",ch6);
printf("fscanf3:%s;\n",ch7);
printf("fscanf4:%s;\n",ch8);

case1.in有修改:

ottff sent
abcde,ghij
kl

运行结果:

fscanf1:ottff;
fscanf2:sent;
fscanf3:abcde;
fscanf4:ghij;

结论:fscanf中,空格,回车,标点符号都可以中止输入


FILE指针中的当前位置

//--------------------------------------------------------------------------------------------

FILE 是 I/O 系统用的。不同编译器结构不完全相同。
char* _ptr; 文件指针当前位置,缓冲区内 马上读和写的位置。
int _cnt; 缓冲区内 现有可以读的字符个数
char* _base; 缓冲区
int _flag; 文件流 特征标志,例如:只读,只写,读写,错误,文件结束,2进制文件。
int _file; 系统里文件属性,例如:谁可以读写(用户自己,用户组,管理员)。
int _charbuf; -- 供 ungetc() 使用的缓冲存储单元。
int _bufsiz; 已分配的缓冲区的大小。
char* _tmpfname; 临时文件名

//--------------------------------------------------------------------------------------------
typedef struct{
short level; 缓冲区使用量
unsigned flags; 文件状态标志
char fd; 文件描述符
short bsize; 缓冲区大小
unsigned char *buffer; 文件缓冲区首地址
unsigned char *curp; 指向文件缓冲区的工作指针
unsigned char hold; 其他信息
unsigned istemp;
short token;
}FILE;

//--------------------------------------------------------------------------------------------
struct __sFILE64 {
# if !defined _AEABI_PORTABILITY_LEVEL || _AEABI_PORTABILITY_LEVEL == 0
unsigned char *_p; /* current position in (some) buffer */
int _r; /* read space left for getc() */
int _w; /* write space left for putc() */
short _flags; /* flags, below; this FILE is free if 0 */
short _file; /* fileno, if Unix descriptor, else -1 */
struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */
int _lbfsize; /* 0 or -_bf._size, for inline putc */

struct _reent *_data;

/* operations */
_PTR _cookie; /* cookie passed to io functions */

_READ_WRITE_RETURN_TYPE _EXFUN((*_read),(struct _reent *, _PTR,
char *, int));
_READ_WRITE_RETURN_TYPE _EXFUN((*_write),(struct _reent *, _PTR,
const char *, int));
_fpos_t _EXFUN((*_seek),(struct _reent *, _PTR, _fpos_t, int));
int _EXFUN((*_close),(struct _reent *, _PTR));

/* separate buffer for long sequences of ungetc() */
struct __sbuf _ub; /* ungetc buffer */
unsigned char *_up; /* saved _p when _p is doing ungetc data */
int _ur; /* saved _r when _r is counting ungetc data */

/* tricks to meet minimum requirements even when malloc() fails */
unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */
unsigned char _nbuf[1]; /* guarantee a getc() buffer */

/* separate buffer for fgetline() when line crosses buffer boundary */
struct __sbuf _lb; /* buffer for fgetline() */

/* Unix stdio files get aligned to block boundaries on fseek() */
int _blksize; /* stat.st_blksize (may be != _bf._size) */
int _flags2; /* for future use */

_off64_t _offset; /* current lseek offset */
_fpos64_t _EXFUN((*_seek64),(struct _reent *, _PTR, _fpos64_t, int));

# ifndef __SINGLE_THREAD__
_flock_t _lock; /* for thread-safety locking */
# endif
# endif /* _AEABI_PORTABILITY_LEVEL */
_mbstate_t _mbstate; /* for wide char stdio functions. */
};

//--------------------------------------------------------------------------------------------

不同的编译器有不同的stdio.h,也对应着定义的不同

codeblocks使用第一种定义,当前指针为fp->_ptr

学校教材上使用第二种,当前指针为fp->curp

学校oj系统用第三种定义,编译器G++,当前指针为fp->_p

然而cb上和学校oj系统上的当前指针有点不同

执行ch=fgetc(fp)是ch读入fp->_ptr指向的内容,然后指针自动前进一位

即case1.in中有:abcd

第一步执行ch=fgetc(fp)后,ch='a',而fp->_ptr已经指向b了,*(fp->_ptr)=b

但在学校oj系统上,ch=fgetc(fp)是指针前进一位,然后读入内容到ch

即case1.in中:abcd,执行ch=fgetc(fp)后,ch='a',此时fp->_p还是在a上,再执行ch=fgetc(fp),fp->_p移动到b,ch=b

这时*(fp->_p)=b,*(fp->_p+1)=c,

换做cb上这样执行两次ch=fgetc(fp)后,*(fp->_ptr)=c了

按照教材上的说法,教材的指针原理和cb上的相同..

妈蛋..学校那题错了6次才猜出来是这个原因,测试后pase.

fgets(),fscanf()的输入测试与FILE中的当前指针的更多相关文章

  1. PHP 文件读取 fread、fgets、fgetc、file_get_contents 与 file 函数

    fread().fgets().fgetc().file_get_contents() 与 file() 函数用于从文件中读取内容. fread() fread() 函数用于读取文件(可安全用于二进制 ...

  2. <正则吃饺子> :关于redis集群的搭建、集群测试、搭建中遇到的问题总结

    项目中使用了redis ,对于其基本的使用,相对简单些,根据项目中已经提供的工具就可以实现基本的功能,但是只是这样的话,对于redis还是太肤浅,甚至刚开始时候,集群.多节点.主从是什么,他们之间是什 ...

  3. 用MFC完成一个简单的猜数字游戏: 输入的四位数中,位置和数字都正确为A,数字相同而位置不同的为B。

    最近学习了MFC一些比较基础的知识,所以打算通过做一个简单的数字游戏来理解MFC的流程并进一步熟悉其操作. 在这里,我做了一个猜数字的小游戏.第一步当然是设计主界面,先给大家展示一下游戏界面: 主界面 ...

  4. input file 在开发中遇到的问题 类似ajax form表单提交 input file中的文件

    最近在做项目的过程中遇到个问题,在这里做个记录防止日后忘记 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为 ...

  5. ajax form表单提交 input file中的文件

    ajax form表单提交 input file中的文件 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为了 ...

  6. 在Windows Server 2008 R2下搭建jsp环境(四)-在测试的过程中可能出现的问题

    环境基本部署好了之后,便开始测试,一定要让他经得起"考验",他才会值得你的信赖.Tomcat服务器部署成功的的验证方法(默认端口的情况下): 1.loacalhost:8080 2 ...

  7. PHP读取文件函数fread,fgets,fgetc,file_get_contents和file函数的使用总结

    fread().fgets().fgetc().file_get_contents() 与 file() 函数用于从文件中读取内容. 1.fread() fread()函数用于读取文件(可安全用于二进 ...

  8. js/jquery 获取本地文件的文件路劲 获取input框中type=‘file’ 中的文件路径(转载)

     原文:http://blog.csdn.net/niyingxunzong/article/details/16989947 js/jquery 获取本地文件的文件路劲 获取input框中type= ...

  9. [App Store Connect帮助]六、测试 Beta 版本(2)输入测试信息以供外部测试

    如果您向外部测试员分发您的 App,您需要输入关于您 App 的额外 TestFlight 测试信息以供“Beta 版 App 审核”.您可以在添加 App 至您的帐户时,或在您邀请外部测试员时输入此 ...

随机推荐

  1. EasyNVR NVR网页无插件直播在兼容宇视NVR RTSP流媒体时PLAY过程对Scale的兼容

    前一段在维护EasyNVR客户的过程中遇到一个问题,在接入宇视NVR的时候,就是明明在vlc中能非常正常播放的视频流,却用EasyRTSPClient RTSP客户端拉流的协议交互过程中,PLAY命令 ...

  2. Hadoop实战-Flume之Sink Load-balancing(十七)

    a1.sources = r1 a1.sinks = k1 k2 a1.channels = c1 # Describe/configure the source a1.sources.r1.type ...

  3. 微软Azure区块链开发工具包三大功能详解

    2018年11月15日,微软宣布了Azure区块链开发工具包,它基于微软的无服务器技术构建,并且利用微软和第三方SaaS,完美集成了区块链.该工具包扩展了微软的区块链开发模板和Azure Blockc ...

  4. 【linux】ubuntu16.04安装vncserver实现远程访问图形界面

    # 步骤 1 - 安装 X11VNC  sudo apt install x11vnc -y # 步骤 2 - 配置访问密码 sudo x11vnc -storepasswd /etc/x11vnc. ...

  5. Java for LeetCode 128 Longest Consecutive Sequence

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  6. /etc/init.d/nginx

    #! /bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="nginx daemon ...

  7. Android Wifi简单的梳理【转】

    本文转载自:http://blog.csdn.net/gabbzang/article/details/10005411 代表一个已经配置过的网络.包含网络ID(networkId).该网络ID代表的 ...

  8. Starting MySQL.. ERROR! The server quit without updating PID file

    版权声明:本文为博主原创文章,未经博主允许不得转载. 注意:本文出自 “阿飞”的博客 ,如果要转载本文章,请与作者联系! 并注明来源: http://blog.csdn.net/faye0412/ar ...

  9. js/html/css做一个简单的图片自动(auto)轮播效果//带注释

    FF(firefox)/chrom/ie稳定暂无bug...注意:请自己建立一个images文件,放入几张900*238的图片(注意图片格式和名字与程序中一致). 1. [图片] 1.JPG 2. [ ...

  10. 「SDOI 2009」Elaxia的路线

    发现自己这几天智商完全不在线-- 这道题的数据十分的水,怎样都可以艹过去-- 开始想了一个完全错误的算法,枚举一对点,判断这一对点是否同时在两条最短路上,是就用两点之间的路径更新答案.显然这样是错的: ...