文件的结尾和文件开头

c语言中文件的结尾指的是文件的最后一个字符的下一个字符

例如:文件a.txt中有三个字符abc,即文件大小为3

那么文件的实际内容如下图.

echo -n abc > a.txt

#include <stdio.h>
#include <stdlib.h>

int main(void){
    FILE* fp = fopen("a.txt","r");
    if(NULL==fp){
        perror("fopen"),exit(-1);
    }
    int c;
    while(!feof(fp)){
        c = getc(fp);
        printf("c=%d\n",c);
        if(ferror(fp)){
            perror("ferror"),exit(-1);
        }
    }
    fclose(fp);
    return 0;
}

c=97

c=98

c=99

c=-1

上面的代码,会把文件结束符EOF也读出来(EOF是个宏,就是-1),

FILE类型中维护了两个标志,即出错标志和文件结束标志

如上,只有先读出了文件中的文件结束符EOF才能设定此文件文件结束标志

所以正确做法应该是

#include <stdio.h>
#include <stdlib.h>

int main(void){
    FILE* fp = fopen("a.txt","r");
    if(NULL==fp){
        perror("fopen"),exit(-1);
    }
    int c;
    while((c=getc(fp))!=EOF){
        printf("c=%d\n",c);
        if(ferror(fp)){
            perror("ferror"),exit(-1);
        }
    }
    return 0;
}

c=97

c=98

c=99

如何读出文件最后一个字符c,如下:

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
int main(void){
    FILE* fp = fopen("a.txt","r");
    fseek(fp,-1,SEEK_END);
    char c;
    c = getc(fp);
    printf("c=%d\n",c);
    fseek(fp,0,SEEK_END);
    printf("feof(fp)=%d\n",feof(fp));//此时在文件结尾处
    //即文件最后一个字符(即c字符)的下一个字符处
    //结果为0
    c = getc(fp); 
    printf("c=%d\n",c); //c=-1
    printf("feof(fp)=%d\n",feof(fp));//结果为1
    return 0;
}

c=99
feof(fp)=0
c=-1
feof(fp)=1

时间: 2024-10-05 05:32:58

文件的结尾和文件开头的相关文章

Python3 open() 函数-用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

完整的语法格式为: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 参数说明: file: 必需,文件路径(相对或者绝对路径). mode: 可选,文件打开模式 buffering: 设置缓冲 encoding: 一般使用utf8 errors: 报错级别 newline: 区分换行符 closefd: 传入的file参数类型 opene

文件流结尾的EOF详解

我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file),也可以是标准输入(stdin). 比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上. int c; while ((c = fgetc(fp)) != EOF) { putchar (c); } 很自然地,我就以为,每个文件的结尾处,有一个叫做EOF的特殊字符,读取到这个字符,操作系统

java代码实现输出指定以.java结尾的文件的绝对路径

package 输出指定文件绝对路径; import java.io.File; /* * 需求:请大家把"E:\\JAVA语言"文件夹下全部的java结尾的文件的绝对路径给输出在控制台. * * 分析: * A:封装文件夹 * B:获取该文件夹下全部的文件或者文件夹的File数组 * C:遍历该File数组,得到每个File对象 * D:推断该File对象是否是文件夹 * 是:回到B * 否:继续推断是否以.java结尾 * 是:就输出该文件的绝对路径 * 否:不搭理它 */ pub

第一章:pip 安装 tar.gz 结尾的文件 和 .whl 结尾的文件

1. 假如后缀中还有 .tar.gz 的文件通过 pip 命令进行安装步骤. .单击 .tar.gz结尾的文件,并且对文件进行解压,进入到解压目录中,通过python命令进行安装. 命令如下:在dos命令行中输入: 进入到目录名中>python3 setup.py install 2. 假如后缀中还有 .whl文件的通过pip命令进行安装 解释:其实 .whl 文件本质上面是一个 .zip 包格式. 例如安装:django-1.10.3 -py2.py3-none-any.whl 安装命令如下:

(原).cc 和 .cpp 后缀结尾的文件的区别

This caused a few problems the first time C++ was ported to a system where case wasn't significant in the filename, however, and different users adopted different solutions: .cc, .cpp, .cxx and possibly others. Today, 非UNIX 系统中 .cpp Unix 系统中常用 .cc (原

查找出/tmp目录下面修改时间是7天以前,大小在50k到2M之间,并以.log结尾的文件

查找出/tmp目录下面修改时间是7天以前,大小在50k到2M之间,并以.log结尾的文件. 答:生成环境 [[email protected] tmp]# date -s "20170501" Mon May  1 00:00:00 CST 2017 [[email protected] tmp]# dd if=/dev/zero of=1.log bs=60KB count=1 1+0 records in 1+0 records out 60000 bytes (60 kB) co

企业必考面试题:查找/oldboy目录下所有7天以前的以log结尾的文件移动到/tmp下。

企业必考面试题:查找/oldboy目录下所有7天以前的以log结尾的文件移动到/tmp下. 要求:请给出至少三种实现方法,有能力的朋友试试看! 方法一. [[email protected] oldboy]# mv $(find . -name "*.log" -size +1M -atime +7) /tmp/ 方法二. [[email protected] oldboy]# mv find . -name "*.log" -size +1M -atime +7

python3 删除以某个后缀结尾的文件

有的时候在用百度云盘下载文件的时候会有一些以结尾的文件,这些文件在下载完必以后没用了有没有自动删除的,这样的文件很多,不能挨着去删除,所以就会写一些脚本来删除, import os path = "H:\\linux\\2016视频" for root, dirs, files in os.walk(path, topdown=False):     for name in files:         if name.endswith('.downloading',):       

搜索系统中所有以.repo结尾的文件并删除(find命令详解及xargs命令详解)

find / -name *.repo | xargs rm –rf //搜索以.repo结尾的文件并删除 find命令详解 精细查找文件或目录d find [ 查找范围 ] [ 查找条件表达式 ] 常用查找条件: 按名称查找:"-name",支持通配符"*"."?" 按文件大小查找:"-size",可使用"+"."-"作为容量条件 按文件属主查找:"-user" 按