fgets函数执行完成后,文件指针如何移动?

用fgets执行之后,读取了文件中的一行,这时文件位置指针是自动指向文件的下一行的开头吗,还是指向当前行的结尾?如果一行的字符串没读取完会怎样?

实例结果:

如果一行的字符串没读取完会,下一次会接着上一次读取;
如果读完了,直接从下一行开头开始。

百度百科:

从文件结构体指针stream中读取数据,每次读取一行。

读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。

如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。

函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

<?php
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        echo $buffer;
    }
    fclose($handle);
}
?>
时间: 2024-11-04 01:43:55

fgets函数执行完成后,文件指针如何移动?的相关文章

《C和C++程序员面试秘笈》——1.12 C++中main函数执行完后还执行其他语句吗

1.12 C++中main函数执行完后还执行其他语句吗 C和C++程序员面试秘笈考点: atexit()函数的使用 出现频率: [解析] 很多时候,我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,例如main()函数运行结束,在程序的某个地方用exit()结束程序,用户通过Ctrl+C等操作发信号来终止程序,等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理.方法就是用atexit()函数来注册程序正常终止时要被调用的函数. atexit()函数的

深入探讨:main函数执行完毕后,是否可能会再执行一段代码?_C 语言

可以使用atexit()函数注册一个函数,代码如下: 复制代码 代码如下: #include "stdafx.h"#include <iostream>using namespace std;//int _onexit(void (*function)(void)); //这句可以要也可以不要void f1(){ cout << "f1()" << endl;}void f2(){ cout << "f2()

ajax-jQuer easyui里怎么在一个请求的回调函数执行后再处理接下来的操作

问题描述 jQuer easyui里怎么在一个请求的回调函数执行后再处理接下来的操作 $("#pandv").treegrid('expand',parentID); if($("#pandv").treegrid('getChildren',parentID).length!=$("#pandv").treegrid('find',parentID).versionCount){ if(!$("#pandv").treegr

指针-一个动态内存分配的问题,函数执行后p指向哪里?

问题描述 一个动态内存分配的问题,函数执行后p指向哪里? 一下是我的代码: #include<stdio.h> #include<stdlib.h> #include<string.h> char *strcnp(char *sd,char *ds) { char *q=sd; while((*ds++=*sd++)!='') NULL; return q; } int main() { char *a[4]={"abc","def&quo

关于利用fgets()改变文件指针位置再利用fprintf()更新文件数据的一些小疑问求教

问题描述 关于利用fgets()改变文件指针位置再利用fprintf()更新文件数据的一些小疑问求教 下面便是一个更新卡信息文件数据的函数updateCard int updateCard(const char* CardPath,const Card* pcard,int nIndex) {//更新卡信息文件中的数据,CardPath为文件路径,pcard为指向要更新的卡信息结点的指针,nIndex为卡信息在文件中的索引号(即在卡信息文件中的行数) FILE* fp = NULL; long

ch2-switch函数有错,执行case0后执行case1有错

问题描述 switch函数有错,执行case0后执行case1有错 int main(){ int c; //开关控制变量 char m; //继续或退出控制变量 ALGraph G; init_ALGraph(G); //初始化图 CreateUDN(G); //创建图 PrintAdjList(G); //打印图 //DFSTraverse(G0); //深度优先搜索 menu(); cout<<""请输入一个游戏控制变量m:m为y或Y表示继续游戏,N或n表示退出游戏:

c++ execl函数执行不存在的文件段错误退出

问题描述 c++ execl函数执行不存在的文件段错误退出 如题,execl执行可执行文件,文件不存在或执行失败时,导致主程序段错误退出,怎么处理这个问题 解决方案 那就在调用execl前 检查文件是否存在咯 解决方案二: 我用的是QT,想调别的程序,别的程序不存在就会段错误 解决方案三: 返回值:执行失败则直接返回-1增加捕获异常. 解决方案四: 那你认为的判断一下不就行了,若不存在则不掉就行了么...

c++-C++open后如何找到文件指针地址

问题描述 C++open后如何找到文件指针地址 大家好,我以往用C编程,现在在尝试融合两个工程,但工程用C++写的,fd.read(buf, length)读文件,我想知道从fd中怎么找到指向文件的指针,我想把指针地址传给另一个工程 解决方案 两个工程,需要把其中一个编译为dll 解决方案二: 指针地址长度 解决方案三: fd.read的fd肯定是一个类!求指针用&fd 解决方案四: 看不懂,描述不是很清晰.首先open的对象是一个文件(或设备),打开之后返回一个文件描述符fd,如果设备或者文件

为什么java不能执行编译后的.class文件呢?求解

问题描述 为什么java不能执行编译后的.class文件呢?求解 就是这个问题,谢谢 解决方案 javac是用来编译的,执行用 "java 类名" 解决方案二: 你先执行>java BeerAndWing2 再执行>javac BeerAndWing2.class 这样就可以了,java 是编译,javac 是执行 解决方案三: Java文件编译成功后的class文件无法执行cmd 执行java Class 文件使用cmd编译java文件成功生成class,但是不能执行 解