C语言文件操作函数详解

目录

引言

一、文件操作函数分类概述

二、字符输入输出函数

         三、文本行输入输出函数

四、格式化输入输出函数

五、二进制输入输出函数

         六、总结


引言



 
在C语言编程中,文件操作是一项非常重要的技能。无论是处理配置文件、记录日志,还是存储和读取数据,都离不开文件操作。本文将详细介绍C语言中常用的文件操作函数,帮助大家更好地理解和运用这些函数。

 



一、文件操作函数分类概述


C语言提供了丰富的文件操作函数,根据功能可大致分为字符输入输出、文本行输入输出、格式化输入输出以及二进制输入输出函数,这些函数在不同的输入输出场景下发挥着作用。
 



二、字符输入输出函数



2.1 fgetc函数
 
 fgetc 函数用于从指定的输入流中读取一个字符。它适用于所有输入流,包括标准输入流 stdin 和文件输入流。函数原型为 int fgetc(FILE *stream) ,返回值为读取到的字符(以 int 类型表示),当读取到文件末尾或发生错误时,返回 EOF (-1)。



 ...c
#include <stdio.h>
int main() {
    FILE *fp = fopen("test.txt", "r");
    if (fp != NULL) {
        int ch = fgetc(fp);
        while (ch != EOF) {
            putchar(ch);
            ch = fgetc(fp);
        }
        fclose(fp);
    }
    return 0;
}
 ...



 
2.2 fputc函数
 
 fputc 函数用于向指定的输出流写入一个字符,适用于所有输出流。函数原型是 int fputc(int c, FILE *stream) ,返回值为写入的字符,如果写入失败则返回 EOF 。
 



...c
#include <stdio.h>
int main() {
    FILE *fp = fopen("test.txt", "w");
    if (fp != NULL) {
        fputc('H', fp);
        fputc('e', fp);
        fputc('l', fp);
        fputc('l', fp);
        fputc('o', fp);
        fclose(fp);
    }
    return 0;
}
 ...
 



三、文本行输入输出函数
 



3.1 fgets函数
 
 fgets 函数从输入流中读取一行字符,它会读取到换行符或者达到指定的字符数限制为止。原型为 char *fgets(char *str, int num, FILE *stream) ,返回值为指向读取到的字符串的指针,如果读取失败或到达文件末尾则返回 NULL 。
 



...c
  
#include <stdio.h>
int main() {
    FILE *fp = fopen("test.txt", "r");
    char buffer[100];
    if (fp != NULL) {
        while (fgets(buffer, sizeof(buffer), fp) != NULL) {
            printf("%s", buffer);
        }
        fclose(fp);
    }
    return 0;
}
 ...



3.2 fputs函数
 
 fputs 函数用于向输出流写入一个字符串,不包括字符串末尾的空字符 \0 。函数原型为 int fputs(const char *str, FILE *stream) ,成功时返回非负值,失败时返回 EOF 。
 



...c
  
#include <stdio.h>
int main() {
    FILE *fp = fopen("test.txt", "w");
    const char *str = "Hello, world!";
    if (fp != NULL) {
        fputs(str, fp);
        fclose(fp);
    }
    return 0;
}
 ...
 



四、格式化输入输出函数
 



4.1 fscanf函数
 
 fscanf 函数从输入流中按照指定的格式读取数据,适用于所有输入流。原型为 int fscanf(FILE *stream, const char *format, ...) ,返回值为成功匹配和赋值的输入项的个数。
 



...c
  
#include <stdio.h>
int main() {
    FILE *fp = fopen("data.txt", "r");
    int num;
    if (fp != NULL) {
        fscanf(fp, "%d", &num);
        printf("读取到的数字: %d\n", num);
        fclose(fp);
    }
    return 0;
}
 ...
 



4.2 fprintf函数
 
 fprintf 函数将数据按照指定格式输出到输出流中。函数原型是 int fprintf(FILE *stream, const char *format, ...) ,返回值为实际输出的字符数,若出错则返回负值。
 



...c
#include <stdio.h>
int main() {
    FILE *fp = fopen("data.txt", "w");
    int num = 100;
    if (fp != NULL) {
        fprintf(fp, "数字是: %d", num);
        fclose(fp);
    }
    return 0;
}
 ...
 



五、二进制输入输出函数
 



5.1 fread函数
 
 fread 函数用于从文件中读取二进制数据。原型为 size_t fread(void *ptr, size_t size, size_t count, FILE *stream) ,返回值为实际读取的完整项数。
 



...c
#include <stdio.h>
struct Data {
    int num;
    float fnum;
};
int main() {
    FILE *fp = fopen("data.bin", "rb");
    struct Data data;
    if (fp != NULL) {
        fread(&data, sizeof(struct Data), 1, fp);
        printf("读取到的整数: %d, 浮点数: %f\n", data.num, data.fnum);
        fclose(fp);
    }
    return 0;
}
 ...
 



5.2 fwrite函数
 
 fwrite 函数用于向文件中写入二进制数据。函数原型是 size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream) ,返回值为实际写入的完整项数。
 



...c
  
#include <stdio.h>
struct Data {
    int num;
    float fnum;
};
int main() {
    FILE *fp = fopen("data.bin", "wb");
    struct Data data = {10, 3.14};
    if (fp != NULL) {
        fwrite(&data, sizeof(struct Data), 1, fp);
        fclose(fp);
    }
    return 0;
}
 ...
 



六、总结



 
C语言的文件操作函数为我们提供了强大而灵活的文件处理能力。通过合理运用这些函数,我们可以轻松地实现各种文件相关的功能。在使用时,要注意文件的打开模式、函数的返回值以及错误处理,以确保程序的稳定性和正确性。希望本文能对大家在C语言文件操作方面有所帮助。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24471.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

向量数据库milvus部署

官方文档 Milvus vector database documentationRun Milvus in Docker (Linux) | Milvus DocumentationMilvus vector database documentation 按部署比较简单&#xff0c;这里说一下遇到的问题 一&#xff1a;Docker Compose 方式部署 1、镜像无法拉取,(docker.io被禁) …

Java 基础面试题

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

清华大学《AIGC发展研究3.0》

大家好&#xff0c;我是吾鳴。 AIGC已经爆火好长一段时间了&#xff0c;特别是DeepSeek的爆火&#xff0c;直接让很多之前没有体会过推理模型的人可以免费的使用上推理模型&#xff0c;同时DeepSeek产品形态也是全球首创&#xff0c;就是直接把AI的思考过程展示给你看&#xff…

苹果CMS泛目录站群架构:无缓存刷新技术的SEO实战

一、技术背景与行业痛点 传统泛目录站群系统普遍依赖静态缓存机制&#xff0c;导致两个核心问题&#xff1a; 缓存臃肿&#xff1a;运行3-6个月后缓存文件可达数百GB量级&#xff0c;严重影响服务器性能内容僵化&#xff1a;缓存机制导致页面TDK&#xff08;标题/描述/关键词…

iview table组件中修改按钮时 要注意是否真的修改了值

如图所示&#xff0c; switch按钮的默认值用dj来控制&#xff0c;但是如果没有加事情去修改切换后的值的话&#xff0c;那么他只会修改本身的显示值&#xff0c;但是我们需要跟着修改的列表数据的dj值是不会修改的&#xff0c;所以要注意&#xff0c;一定要加上事情去修改确定的…

Go中slice和map引用传递误区

背景 关于slice和map是指传递还是引用传递&#xff0c;很多文章都分析得模棱两可&#xff0c;其实在Go中只有值传递&#xff0c;但是很多情况下是因为分不清slice和map的底层实现&#xff0c;所以导致很多人在这一块产生疑惑&#xff0c;下面通过代码案例分析slice和map到底是…

Linux网络基础(协议 TCP/IP 网络传输基本流程 IP VS Mac Socket编程UDP)

文章目录 一.前言二.协议协议分层分层的好处 OSI七层模型TCP/IP五层(或四层)模型为什么要有TCP/IP协议TCP/IP协议与操作系统的关系(宏观上是如何实现的)什么是协议 三.网络传输基本流程局域网(以太网为例)通信原理MAC地址令牌环网 封装与解包分用 四.IP地址IP VS Mac地址 五.So…

python-leetcode-乘积最大子数组

152. 乘积最大子数组 - 力扣&#xff08;LeetCode&#xff09; class Solution:def maxProduct(self, nums: List[int]) -> int:if not nums:return 0max_prod nums[0]min_prod nums[0]result nums[0]for i in range(1, len(nums)):if nums[i] < 0:max_prod, min_prod…

图像处理之图像边缘检测算法

目录 1 图像边缘检测算法简介 2 Sobel边缘检测 3 经典的Canny边缘检测算法 4 演示Demo 4.1 开发环境 4.2 功能介绍 4.3 下载地址 参考 1 图像边缘检测算法简介 图像边缘检测是计算机视觉和图像处理中的基本问题&#xff0c;主要目的是提取图像中明暗变化明显的边缘细节…

React 源码揭秘 | Effect更新流程

前面的文章介绍了 hooks和commit流程&#xff0c;算是前置知识&#xff0c;这篇来讨论一下useEffect的原理。 useEffect用来处理副作用&#xff0c;比如网络请求&#xff0c;dom操作等等, 其本质也是个hooks&#xff0c;包含hooks的memorizedState, updateQueue, next Effec…

【Linux】vim 设置

【Linux】vim 设置 零、起因 刚学Linux&#xff0c;有时候会重装Linux系统&#xff0c;然后默认的vi不太好用&#xff0c;需要进行一些设置&#xff0c;本文简述如何配置一个好用的vim。 壹、软件安装 sudo apt-get install vim贰、配置路径 对所有用户生效&#xff1a; …

qt-C++笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试

qt-C笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试 code review! 文章目录 qt-C笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试1.Application(Qt):Qt Widgets Application1.1.qmake版本1.2.cmake版本 2.Application(Qt):Qt Console Applicati…

Vue 项目中配置代理的必要性与实现指南

Vue 项目中配置代理的必要性与实现指南 在 Vue 前端项目的开发过程中&#xff0c;前端与后端地址通常不同&#xff0c;可能引发跨域问题。为了在开发环境下顺畅地请求后端接口&#xff0c;常常会通过配置**代理&#xff08;proxy&#xff09;**来解决问题。这篇文章将详细解析…

Linux运维命令-三剑客(grep awk sed)

目录 1.简介 2.命令详解 2.1.grep命令 2.1.1.功能 2.1.2.常见的使用场景及命令 2.2.awk命令 2.2.1.功能 2.2.2.常见的使用场景及命令 2.3.sed命令 2.3.1.功能 2.&#xff13;.2.常见的使用场景及命令 3.总结 1.简介 在Linux中&#xff0c;grep、awk、sed 命令常被称…

浅析 Redis 分片集群 Cluster 原理、手动搭建、动态伸缩集群、故障转移

大家好&#xff0c;我是此林。 之前的文章中分享了 Redis 集群方案的一种&#xff1a;主从集群哨兵机制 浅谈 Redis 主从集群原理&#xff08;一&#xff09;-CSDN博客 浅谈 Redis 主从复制原理&#xff08;二&#xff09;-CSDN博客 这种模式有什么缺点呢&#xff1f; 1. 虽…

Javaweb后端数据库多表关系一对多,外键,一对一

多表关系 一对多 多的表里&#xff0c;要有一表里的主键 外键 多的表上&#xff0c;添加外键 一对一 多对多 案例

PhotoLine绿色版 v25.00:全能型图像处理软件的深度解析

在图像处理领域,PhotoLine以其强大的功能和紧凑的体积,赢得了国内外众多用户的喜爱。本文将为大家全面解析PhotoLine绿色版 v25.00的各项功能,帮助大家更好地了解这款全能型的图像处理软件。 一、迷你体积,强大功能 PhotoLine被誉为迷你版的Photoshop,其体积虽小,但功能却…

Windows 11【1001问】修改主题隐藏或删除Win11桌面“了解此图片”

在<Windows 11【1001问】如何安装Windows 11>篇幅中我们第一安装完成Windows 11还未开始其他操作的时候会发现桌面上有一个“了解此图片”的图标是之前没见过的&#xff1b;而在Windows 11中&#xff0c;“了解此图片”图标是微软引入的一项功能&#xff0c;旨在让用户通…

Spring MVC框架二:创建第一个MVC程序

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 有两种方式 利用配置 1、利用IDEA新建一个Maven项目&#xff0c;添加一个web支持 2、导入常用的依赖 <dependencies><dependency><groupId>junit&…

go基本语法

跟Java比较学习。 hello word 示例代码 test1.go文件&#xff1a; // 包路径 package main// 导入模块&#xff0c;下面两种都行 import ("fmt" ) import "log"// main方法 func main() {log.Print("hello word !!!")fmt.Print("hello …