文件初阶入门(葵花宝典)

2024-06-15 16:36
文章标签 入门 初阶 葵花宝典

本文主要是介绍文件初阶入门(葵花宝典),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 文件的顺序读写

1.1 顺序读写函数的介绍

函数名     功能                    适用于

fgetc        字符输入函数      所有输入流

fputc        字符输出函数      所有输出流

fgets        文本行输入函数  所有输入流

fputs        文本行输出函数   所有输出流

fscanf      格式化输入函数   所有输入流

fprintf       格式化输出函数   所有输出流

fread        二进制输入           文件输入流

fwrite        二进制输出           文件输出流

上面的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流); 所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。

1.2 对比一组函数

1.2.1 scanf/fscanf/sscanf

1.2.2 printf/fprintf/sprintf

2. 文件的随机读写

2.1 fseek

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)

int fseek ( FILE * stream, long int offset, int origin );

例子:

#include<stdio.h>
int main()
{
    FILE* pf = fopen("data.txt", "wb");
    fputs("This is an apple", pf);
    fseek(pf, 9, SEEK_SET);
    fputs(" sam", pf);
    fclose(pf);
    return 0;
}

2.2 ftell

返回文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

int main()
{
    long size;
    FILE* pf = fopen("data.txt", "rb");
    if (pf = NULL)
    {
        perror("Error opening file ");
    }
    else
    {
        feek(pf, 0, SEEK_END);
        size = ftell(pf);
        fclose(pf);
        printf("Size of myfile.txt: %ld bytes\n", size);
    }
    return 0;
}

2.3 rewind

让文件指针位置回到文件的起始位置。

void rewind ( FILE * stream );

int main()
{
    int n;
    FILE* pf;
    char buf[27];
    pf = fopen("data.txt", "w+");
    for (n = 'A'; n <= 'Z'; n++)
    {
        fputc(n, pf);
    }
    rewind(pf);
    fread(buf, 1, 26,pf);
    fclose(pf);
    buf[26] = '\0';
    printf("buf");
    return 0;
}

3. 文件读取结束的判定

3.1 被错误使用feof

在文件读取过程中,不能使用feof函数的返回值直接判断文件是否结束。

feof的作用是:当文件读取结束的时候,判断读取结束原因是否是:遇到文件末尾结束。

1. 文件读取是否结束,判断返回值为EOF(fgetc),或者NULL(fgets)

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如:

fread判断返回值是否小于实际要读的个数。

文本文件例子:

# include <stdio.h>
# include <stdlib.h>
int main ( void )
{
int c; // 注意: int ,⾮ char ,要求处理 EOF
FILE* fp = fopen( "test.txt" , "r" );
if (!fp) {
perror( "File opening failed" );
return EXIT_FAILURE;
}
//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回 EOF
while ((c = fgetc(fp)) != EOF) // 标准 C I/O 读取⽂件循环
{
putchar (c);
}
// 判断是什么原因结束的
if (ferror(fp))
puts ( "I/O error when reading" );
else if (feof(fp))
puts ( "End of file reached successfully" );
fclose(fp);
}
二进制文件例子;
#include <stdio.h>
enum { SIZE = 5 };
int main(void)
{double a[SIZE] = { 1.,2.,3.,4.,5. };FILE* fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp = fopen("test.bin", "rb");size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double 的数组if (ret_code == SIZE) {puts("Array read successfully, contents: ");for (int n = 0; n < SIZE; ++n)printf("%f ", b[n]);putchar('\n');}else { // error handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}

4. 文件缓冲区

ANSIC 标准采⽤“缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为
程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓
冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输
⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓
冲区的⼤⼩根据C编译系统决定的
#include <stdio.h>
#include <windows.h>
//VS2022 WIN11环境测试
int main()
{FILE*pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开test.txt⽂件,发现⽂件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)//注:fflush 在⾼版本的VS上不能使⽤了printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭⽂件的时候,也会刷新缓冲区pf = NULL;return 0;
}

结论:因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件。

这篇关于文件初阶入门(葵花宝典)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063988

相关文章

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习