C语言:文件I/O

C语言文件I/O实战:从打开、读写到关闭的全流程指南 本文系统介绍了C语言文件操作的核心知识,包括文件操作三部曲(打开、操作、关闭)、fopen函数的模式选择、各类文件I/O函数的使用方法。重点讲解了按字符读写(fgetc/fputc)、按块读写(fread/fwrite)、格式化读写(fprintf/fscanf)以及随机位置读写(fseek)等关键技术,并通过代码实例演示了各种操作的具体应用场景和实现方式。文章最后强调文件操作是C语言编程的重要能力,正确使用文件函数和做好错误处理是保证程序健壮性的关键。 阅读详情

内容提要

  • 预处理

  • 库文件

  • 文件I/O

    • 标准I/O

预处理

预处理功能

条件编译
概念

定义:根据设定的条件选择待编译的语句代码。

预处理机制:==将满足条件的语句进行保留,将不满足条件的语句进行删除==,交个下一步编译。

语法:

  • 语法1:

    根据是否找到标记,来决定是否参与编译(==标记存在为真,不存在为假==)

    #ifdef 标记   // 标记 一般使用宏定义
    ... 语句代码1
    #else
    ... 语句代码2
    #endif

    举例:

    #define DEBUG 1  
    #ifdef DEBUG
        printf("调试模式!\n"); // 保留
    #else
        printf("产品模式!\n"); // 删除
    #endif

    说明:printf("调试模式!\n");和printf("调试模式!\n");只能保留一个。

    undef 取消已定义的宏(使其变为未定义状态)。

    #define DEBUG 1  // 定义宏
    #undef DEBUG     // 取消定义的宏
    #ifdef DEBUG
        printf("调试模式!\n"); // 删除
    #else
        printf("产品模式!\n"); // 保留
    #endif
  • 语法2:

    根据是否找到标记,来决定是否参与编译(==标记不存在为真,存在为假==)

    #ifndef  标记
    ... 语句代码1
    #else
    ... 语句代码2
    #endif

    举例:

    #define DEBUG 1  
    #ifndef DEBUG
        printf("调试模式!\n"); // 删除
    #else
        printf("产品模式!\n"); // 保留
    #endif
  • 语法3:

    根据表达式的结果,来决定是否参与编译(==表达式成立为真,不成立为假==)

    // 单分支
    #if 表达式
    ... 语句代码1
    #endif
        
    // 双分支
    #if 表达式
    ... 语句代码1
    #else
    ... 语句代码2
    #endif
        
    // 多分支
    #if 表达式1
    ... 语句代码1
    #elif 表达式n
    ... 语句代码n
    #else
    ... 语句代码n+1
    #endif
案例
案例1
/*************************************************************************
  > File Name:    demo01.c
  > Author:       三道渊
  > Description:  
  > Created Time: 2025-08-05 09:52:19
 ************************************************************************/
#include <stdio.h>
​
// 定义一个条件编译的标记
#define LETTER 1 // 默认是大写
​
int main(int argc, char *argv[])
{
    // 测试用的字母字符串
    char str[26] = "C Language";
    
    char c;
    
    int i = 0;
    
    // 遍历获取每一个字符
    while ((c = str[i]) != '\0')
    {
#if LETTER
        if (c >= 'a' && c <= 'z')
        {
            c -= 32; // 大写
        }
#else
        if (c >= 'A' && c <= 'Z')
        {
            c += 32; // 小写
        }
#endif
        printf("%c",c);
        i++;
    }
    printf("\n");
    
    return 0;
}
案例2

需求:跨平台适配代码

#ifdef _WIN32  // Windows系统宏(VC编译器定义)
    #include <windows.h>
#else  // Linux/Unix系统
    #include <unistd.h>
#endif
#ifdef _WIN32  // Windows系统宏(VC编译器定义)
    #include <windows.h>
#else  // Linux/Unix系统
    #include <unistd.h>
#endif
/*************************************************************************
  > File Name:    demo01.c
  > Author:       三道渊
  > Description:  
  > Created Time: 2025-08-05 09:52:19
 ************************************************************************/
#include <stdio.h>
​
// 定义一个条件编译的标记
#define LETTER 1 // 默认是大写
​
int main(int argc, char *argv[])
{
#ifdef _WIN32  // Windows系统宏(VC编译器定义)
    printf("当前是windows平台!\n");
#else  // Linux/Unix系统
    printf("当前是Linux平台!\n");
#endif
    
    return 0;
}
文件包含
概念

所谓“文件包含”处理是指一个源文件可以将另一个源文件的全部内容包含进来。通常用于共享代码、声明或宏定义。一个常规的C语言程序会包含多个源文件(*.c),当某些公共资源需要在各个源文件中使用时,为了避免多次编写相同的代码,我们一般会进行代码的抽取(*.h),然后在各个源文件中直接包含即可。

注意:*.h中的函数声明必须要在*.c中有对应的函数定义,否则没有意义。(函数一旦声明,就一定要定义)

基本语法
  • 标准库包含(使用尖括号)(会到/usr/include目录下查找)

    #include <stdio.h>   // 包含标准输入输出库 会到/usr/include目录下查找
    #include <stdlib.h>  // 包含标准库函数
  • 自定义文件包含(使用双引号)(会先在当前目录下查找,找不到再到/usr/include目录下查找)

    #include "myheader.h"   // 包含当前目录下的自定义头文件
    #include "utils/tool.h" // 包含子目录下的头文件
预处理机制

==将文件中的内容替换文件包含指令==

使用场景
  • 头文件包含:通常将函数声明、宏定义、结构体定义等放在.h头文件中,通过#include引入到需要使用的.c文件中。

    头文件中存放的内容,就是各个源文件的彼此可见的公共资源,包括:

    • 全局变量的声明

    • 普通函数的声明

    • 静态函数的声明(static修饰的函数,建议写在.c文件中)

    • 宏定义

    • 结构体、共用体、枚举常量列表的定义

    • 其他头文件包含

  • 代码复用:可以将一些通用代码片段(如工具函数)放在单独的文件中,通过包含实现复用。

    示例代码:

    myhead.h

     extern int global;   // 全局变量的声明
     extern void func1(); // 普通函数的声明
     static void func2()  // 静态函数的声明,写在.h中,引用此文件的.c文件直接调用,写在.c文件,只能这个.c文件访问
     {
         ...
     }
     
     #define max(a,b) ((a) > (b) ? (a) : (b))   // 宏定义
     
     struct node          // 结构体定义
     {
         ..
     };
     
     union attr           // 共用体定义
     {
         ..  
     };
     
     enum SEX             // 枚举常量列表定义
     {
         ..  
     };
     
     #include <stdio.h>   // 引入系统头文件
     #include "myhead2.h" // 引入自定义头文件
注意事项
  • 避免循环包含(如a.h包含b.h,同时b.h又包含a.h)

  • 为防止头文件被重复包含,通常会使用条件编译保护(推荐):

    // 在myheader.h中
    #ifndef MYHEADER_H  // _MYHEADER_H,   __MYHEADER_H
    #define MYHEADER_H
    ... 头文件内容
    #endif
    或者使用#pragma once(非标准但被大多数编译器支持):
    
    #pragma once
    ... 头文件内容

或者使用`#pragma once`(非标准但被大多数编译器支持):

#pragma once
... 头文件内容

多文件开发
  • myheader.h

    /*************************************************************************
      > File Name:    
      > Author:       三道渊
      > Description:  
      > Created Time: 2025-08-05 10:51:08
     ************************************************************************/
    #ifndef MYHEADER_H
    #define MYHEADER_H
    ​
    #include <stdio.h>
    ​
    /**
     * 求数组的元素累加和
     */
    extern int sum(const int*, int);
    ​
    #endif
  • myheader.c

    /*************************************************************************
      > File Name:    
      > Author:       三道渊
      > Description:  
      > Created Time: 2025-08-05 10:51:08
     ************************************************************************/
    #include "myheader.h"
    ​
    /**
     * 求数组的元素累加和
     */
    int sum(const int* arr, int len)
    {
        const int *p = arr;
        int sum = 0;
        for (; p < arr + len; p++)
        {
            sum += *p;
        }
        return sum;
    }
    ​
  • app.c

    /*************************************************************************
      > File Name:    
      > Author:       三道渊
      > Description:  
      > Created Time: 2025-08-05 10:51:08
     ************************************************************************/
    #include "myheader.h"
    ​
    int main(int argc, char **argv[])
    {
        int arr[] = {11,22,33,44,55};
        
        int res = sum(arr, sizeof(arr)/sizeof(arr[0]));
        
        printf("数组累加和的结果是%d\n", res);
        
        return 0;
    }
  • 多文件编译命令:

    gcc app.c myhead.c -o app

其他指令(了解)
  1. #line 用于修改当前的行号和文件名(主要用于编译器调试,很少手动使用)。

     #line 100 "test.c"  // 后续代码从行号100开始,文件名标识为test.c
     printf("当前行号:%d\n", __LINE__);  // 输出100
  2. #error 在编译阶段当条件满足时抛出错误信息,并终止编译。

     #if VERSION < 1
     #error "VERSION必须大于等于1"  // 若VERSION<1,编译时会报错并提示此信息
     #endif
  3. #pragma 用于向编译器传递特定指令(不同编译器支持的#pragma功能不同),例如:

    • #pragma once:确保头文件只被包含一次(类似#ifndef的效果)。简单但兼容性稍差

    • #pragma pack(n):设置结构体成员的对齐方式为 n 字节。

    • #pragma warning(disable: 1234):禁用特定警告编号的编译警告。

库文件

什么是库文件

库文件本质上是经过编译后生成的可被计算机执行的二进制代码。但注意库文件不能独立运行,库文件需要加载到内存中才能执行。库文件大量存在于Windows,Linux,MacOS等软件平台上。

库文件的分类

  • 静态库

    • windows:xxx.lib

    • linux:libxxxx.a

  • 动态库(共享库)

    • windows:xxx.dll

    • linux:libxxxx.so.major.minor (libmy.so.1.1)

注意:不同的软件平台因编译器、链接器不同,所生成的库文件是不兼容的。

静态库与动态库的区别
  1. 静态库链接时,将库中所有内容包含到最终的可执行程序中(==程序和库合一==)。

  2. 动态库链接时,将库中的符号信息包含到最终可执行文件中,在程序运行时,才将动态库中符号的具体实现加载到内存中(==程序和库分离==)。

静态库与动态库的优缺点
  1. 静态库

    • 优点:生成的可执行程序不再依赖静态文件

    • 缺点:可执行程序体积较大

  2. 动态库

    • 优点:生成的可执行程序体积小;动态库可被多个应用程序共享

    • 缺点:可执行程序运行依然依赖动态库文件

静态库与动态库对比
维度静态库动态库
文件体积较大(库代码被复制)较小(共享库文件)
部署难度简单(单文件)需确保库存在于目标系统
更新维护需重新编译程序替换库文件即可
启动速度稍快(无运行时链接开销)稍慢(需加载库)
兼容性风险无需处理版本冲突(如DLL Hell)

库文件创建

Linux系统下库文件的命名规范:libxxx.a(静态库) libxxxx.so(动态库)

静态库文件的生成
  1. 将需要生成库文件对应的源文件(*.c)通过编译(不链接)生成*.o目标文件

  2. 用ar命令将生成的*.o打包生成libxxx.a

动态库文件的生成
  1. 将需要生成库文件对应的源文件(*.c)通过编译(不链接)生成*.o目标文件

  2. 将目标文件链接为*.so文件

注意:如果在代码编译过程或者运行中链接了库文件,系统会到/lib和/usr/lib目录下查找库文件,所以建议直接将库文件放在/lib或者/usr/lib,否则系统可能无法找到库文件,造成编译或者运行错误。

扩展内容
  1. 查看应用程序(例如:app)依赖的动态库:

  2. 动态库使用方式:

    • 编译时链接动态库,运行时系统自动加载动态库

    • 程序运行时,手动加载动态库

    • 实现:

      • 涉及内容

        • 头文件:#include <dlfcn.h>

        • 接口函数:dlopen、dlclose、dlsym

        • 依赖库:-ldl

        • 句柄handler:资源的标识

      • 示例代码:

        /*************************************************************************
          > File Name:    demo06.c
          > Author:       三道渊
          > Description:  
          > Created Time: 2025年03月28日 星期五 15时16分45秒
         ************************************************************************/
        ​
        #include <stdio.h>
        #include <dlfcn.h>
        ​
        int main(int argc,char *argv[])
        {
            // 1. 加载动态库 "/lib/libdlfun.so"
            //    - RTLD_LAZY: 延迟绑定(使用时才解析符号,提高加载速度)
            //    - 返回 handler 是动态库的句柄,失败时返回 NULL
            void* handler = dlopen("/lib/libdlfun.so", RTLD_LAZY); 
            if (handler == NULL) 
            {
                // 打印错误信息(dlerror() 返回最后一次 dl 相关错误的字符串)
                fprintf(stderr, "dlopen 失败: %s\n", dlerror());
                return -1;
            }
        ​
            // 2. 从动态库中查找符号 "sum"(函数名)
            //    - dlsym 返回 void*,需强制转换为函数指针类型  int sum(int *arr, int size);
            //    - 这里假设 "sum" 是一个接受两个int*,int参数、返回 int 的函数
            int (*paddr)(int*, int) = (int (*)(int*, int))dlsym(handler, "sum");
            if (paddr == NULL) 
            {
                fprintf(stderr, "dlsym 失败: %s\n", dlerror());
                dlclose(handler);  // 关闭动态库(释放资源)
                return -1;
            }
        ​
            // 3. 调用动态库中的函数 "sum",计算{11,12,13,14,15}的累加和
            int arr[5] = {11,12,13,14,15};
            printf("sum=%d\n", paddr(arr, sizeof(arr)/sizeof(arr[0])));
        ​
            // 4. 关闭动态库(释放内存和资源)
            dlclose(handler);
            return 0;
        }
      • 编译命令

        gcc demo06.c -ldl

标准I/O

文件基础概念

文件定义

存储在外存储器(磁盘、U盘、移动硬盘等)上的数据集合,是操作系统管理数据的基本单位。

文件操作核心
  • 文件内容的读取(输入操作 Input)

  • 文件内容的写入(输出操作 Output)

文件缓冲机制
  • 系统为文件在内存中创建缓冲区(通常4KB大小)

  • 程序操作实际上是在缓冲区进行

  • 数据像水流一样流动,称为“文件流”

  • 缓冲机制减少了直接访问外存的次数,提高效率

文件分类
  1. 文本文件(ASCII文件)

    • 以ASCII码形式存储

    • 可直接用文本编辑器查看

    • 示例:.txt、.c、.h文件

  2. 二进制文件

    • 以二进制形式存储

    • 需要特定程序才能解析

    • 示例:.exe、.jpg、.dat文件

文件标识
  1. 文件系统中:路径 + 文件名

    • Windows示例:D:\edu\test.txt

    • Linux示例:/home/user/data.bin

  2. C程序中:文件指针(FILE *类型)

    FILE *fp;   // 声明文件指针

文件操作的基本步骤

  1. 打开文件:建立程序与文件的连接

  2. 文件处理:读写操作

  3. 关闭文件:释放资源

文件打开与关闭

fopen()

说明:打开文件

函数原型:

#include <stdio.h>
​
FILE *fopen(const char *path, const char *mode);

参数详解:

  • path:文件路径(绝对路径或相对路径)

  • mode:打开模式

    • 基本模式(ASCII模式):

      • r:只读(文件必须存在)

      • w:只写(有文件打开,无文件创建/清空已有文件)覆盖式写入

      • a:追加(文件不存在则创建)追加式写入

      • r+:读写(文件必须存在)

      • w+:读写(创建新文件/清空已有文件)

      • a+:读/追加(文件不存在则创建)

    • 二进制模式:

      • rb、wb、ab等,其实就是基本模式的前提下,加b

    • 特殊模式:

      • x:独占模式(与w组合,文件必须不存在)

返回值:

  • 成功:返回文件指针(指向FILE结构体)

  • 失败:返回NULL(需要检查errno)

错误处理示例:

FILE *fp = fopen("data.txt","r");
if(fp == NULL)
{
    perror("文件打开失败!");
    // 退出进程
    exit(EXIT_FAILURE); // exit(1)   程序失败退出
}
fclose()

说明:关闭文件

函数原型:

#include <stdio.h>
​
int fclose(FILE *fp);

参数

  • stream(文件指针):指向要关闭的 FILE 对象的指针,通常由 fopen() 或类似函数返回。

返回值

  • 成功:返回 0(即 EXIT_SUCCESS)。

  • 失败:返回 EOF(通常是 -1),并设置 errno 指示错误原因(如磁盘已满、文件被占用等)。

注意事项:

  • 必须关闭所有打开的文件

  • 程序退出时未关闭的文件可能丢失数据

  • 多次关闭同一文件指针会导致未定义行为

文件顺序读写

单字符读写
fgetc()

说明:单字符的读取

函数原型:

int fgetc(FILE *fp);

参数说明:

  • fp:待操作的文件指针

返回值:

  • 成功:返回字符的ASCII码

  • 失败:或者文件末尾返回EOF(-1)

fputc()

说明:单字符的写出

函数原型:

int fputc(int c, FILE *fp);

参数说明:

  • c:待写出的字符的ASCII码

  • fp:待操作的文件指针

返回值:

  • 成功:返回写入的字符的ASCII码

  • 失败:返回EOF(-1)

行读写(多字符读写)
fgets()

说明:读取字符串(字符数组)

函数原型:

#include <stdio.h>
​
char* fgets(char *buf, int size, FILE *fp);

功能描述:

从指定的文件流(fp)中读取一行字符串(以 \n 结尾),并将其存储到缓冲区 buf 中。

  • 读取的字符数最多为 size - 1(保留一个位置给 \0)。

  • 如果遇到 换行符 \n 或 文件结束符 EOF,则停止读取。

  • 读取的字符串末尾会自动添加 \0(空字符),使其成为合法的 C 字符串。

参数:

  • buf(缓冲区):用于存储读取数据的字符数组(必须足够大)。

  • size(最大读取长度):最多读取 size - 1 个字符(防止缓冲区溢出)。

  • fp(文件指针):要读取的文件流(如 stdin、fopen() 返回的指针等)。

返回值

  • 成功:返回 buf 的指针(即读取的字符串)。

  • 失败或到达文件末尾(EOF):返回 NULL。

fputs()

说明:写入字符串

函数原型:

int fputs(const char *str, FILE *fp);

功能描述:

将字符串 str 写入到指定的文件流 fp 中。

  • 不自动添加换行符:与 puts() 不同,fputs 不会在末尾自动添加 \n。

  • 遇到 \0 停止:写入过程遇到字符串结束符 \0 时终止(\0 本身不会被写入)。

参数:

  • str:要写入的字符串(必须以 \0 结尾)。

  • fp:目标文件流(如 stdout、文件指针等)。

返回值:

  • 成功:返回一个非负整数(通常是 0 或写入的字符数)。

  • 失败:返回 EOF(-1),并设置 errno 指示错误原因(如磁盘已满、文件不可写等)。

C语言标准I/O完全指南:从printf/scanf到文件与缓冲区管理 在计算机编程中,输入输出(I/O)是程序与外部世界交互的基础机制。其核心原理在于通过抽象的数据流(Stream)模型,将键盘、屏幕、文件等物理设备统一处理,从而实现数据的读写。这项技术的核心价值在于提供了强大的可移植性和性能优化能力,使得开发者无需关心底层硬件差异。在实际工程应用中,I/O系统广泛用于数据处理、日志记录、用户交互和文件操作等场景。本文将深入探讨C语言标准I/O库中的格式化输出输入、文件系统交互以及缓冲区管理,重点解析printf的格式化控制字符串、scanf的输入匹配机制以及setvbuf的 阅读详情

相关推荐

C语言宿舍管理系统:3种数据结构方案对比与文件I/O性能实测

本文深入对比了C语言宿舍管理系统中数组、链表和动态数组三种数据结构方案的性能差异,并通过实测数据分析了文件I/O操作的效率。文章详细展示了静态数组、单向链表和动态数组的实现代码,以及它们在插入、删除、查询等操作中的性能表现,为高校信息化建设中的宿舍管理系统优化提供了实用建议。

weixin_30843121的博客 308

文件I/O操作:C语言

阐述读取文件的过程:单纯的从C语言上讲,磁盘上的数据文件内容是先被内存读取,我们程序创建一个变量(char[]字符串类型),把读出来的数据赋予这个变量;磁盘上的数据文件先被内存读取,指的就是文件缓冲区先读取数据;3.文件I/O操作,所用的都是Linux的那一套基础核心理论,第一层的封装是C语言或C++;因为他俩在同一层上,只不过封装的实现操作不同,而且C++使用起来比C语言更简单,但是C语言的函数更有操作性,层次性,一步一步来;主要是将未写入文件的内容写入到文件中,未打印的文字,打印出来;

qincjun的博客 1116

20、探索C语言编程中的高级主题:深入理解文件I/O与数据结构

本文深入探讨了C语言编程中的高级主题,包括文件I/O操作、数据结构的应用、线程与多线程编程、进程间通信(IPC)以及网络编程等内容。通过实际代码示例,展示了如何将这些技术应用于日志记录系统、数据库管理系统等场景,帮助读者提升C语言编程技能并解决复杂问题。

ik678901234的博客 427

【C语言】文件I/O的不同方式:文件描述符fd和FILE *

fd是更接近系统的底层接口,适合需要精确控制和高效处理的场景;FILE *是 C 标准库封装的高层接口,使用简单、功能丰富,适用于大多数应用程序开发;

BaiiaJava的博客 827

大众奥迪诊断不求人:手把手解析SAE J2819(CAN TP2.0)协议报文与连接流程

本文深入解析大众奥迪车型诊断核心标准SAE J2819(CAN TP2.0)协议,详细拆解连接建立流程与报文控制字段。通过实战案例展示通道设置、参数协商等关键步骤,提供诊断设备配置建议和常见故障排查技巧,帮助工程师掌握汽车诊断通信协议的精髓。

weixin_30421809的博客 396

abaqus2matlab的安装与使用:如何用matlab提取abaqus的odb结果

官网abaqus2matlab官网地址matlab社区地址matlab社区地址在这里可以看到.m文件的源码论文:Abaqus2Matlab: A suitable tool for finite element post-processingabaqus2matlab可以处理.inp、.fil、.odb三种类型的文件。.inp文件:处理功能就在于只是单纯的输出inp文件,由于我自己写了自己的函数,不需要用到这个功能。

qianxin1234的博客 2016

C语言文件拷贝:从标准I/O到内存映射的四种实现与性能对比

文件I/O是编程中的基础概念,涉及数据在存储介质与内存间的传输。其核心原理是通过系统调用或库函数,在用户空间与内核空间之间移动数据,以完成读写操作。这项技术的价值在于它是几乎所有应用程序与操作系统交互、处理持久化数据的基石。在工程实践中,文件拷贝是检验I/O理解深度的典型场景,广泛应用于工具开发、数据处理和系统编程。本文聚焦C语言,深入探讨标准I/O、系统调用与内存映射等不同层次的实现方案,并分析其性能差异与适用场景,为开发者选择高效、健壮的拷贝策略提供决策依据。

weixin_34034261的博客 346

鼎阳示波器SCPI指令与MD5算法解锁带宽升级实战

本文详细介绍了鼎阳示波器通过SCPI指令与MD5算法实现带宽升级的实战流程。从设备连接、信息获取到Python密钥生成脚本解析,逐步指导用户完成升级操作,并涵盖常见问题排查与功能选件激活指南,帮助用户充分释放设备潜能。

www00的博客 342

C语言文件I/O操作:fopen和freopen函数详解

在C语言中,文件I/O(Input/Output)操作是非常常见的任务,用于读取和写入文件。其中,fopen和freopen函数是文件操作中的重要工具,用于打开和重新打开文件。本篇博客将详细介绍这两个函数的用法、特点以及示例。

Dreamer2176的博客 1504

从Excel到Power Pivot:构建你的第一个商业智能分析模型

本文详细介绍了如何从Excel升级到Power Pivot,构建你的第一个商业智能分析模型。通过激活Power Pivot功能、导入数据、建立表关系、创建智能度量值以及打造交互式仪表盘,帮助用户高效处理百万行级别的数据,实现数据自动关联和动态分析,大幅提升商业决策效率。

weixin_30629653的博客 255

不用敲命令!用宝塔面板可视化部署pbootCMS的保姆级教程(2024最新版)

本文提供2024年最新版pbootCMS可视化部署教程,全程使用宝塔面板操作,无需任何命令行知识。从服务器初始化、LNMP环境配置到源码上传、安装向导,手把手指导用户通过图形化界面快速搭建专业网站,适合零基础新手和追求高效建站的用户。

weixin_42509507的博客 490

C语言文件操作:读写文件与文件I/O

在C语言中,文件操作是程序设计中不可或缺的一部分。通过文件I/O(输入/输出)操作,程序可以读取存储在硬盘上的数据,也可以将数据写入硬盘中的文件。C语言标准库提供了丰富的函数用于文件的打开、读取、写入和关闭等操作。本文将详细介绍如何使用C语言进行文件操作,包括文件的打开、读写以及关闭。

2401_86651485的博客 630

DexProtector内存校验绕过与DEX提取实战

DEX文件是Android应用的核心执行单元,其动态加载与运行时保护机制直接关系到App安全强度。DexProtector作为主流商业加固方案,摒弃传统文件级防护,转而依托ART虚拟机下的匿名内存映射段(anonymous mmap)构建多维校验体系——涵盖字节码完整性校验、内存页属性检测及运行时环境感知。其技术价值在于将防护锚点从静态APK迁移至动态内存态,大幅提升逆向门槛。典型应用场景包括金融类App的防篡改加固、游戏客户端的反外挂保护,以及政企应用的合规性安全增强。本文聚焦DexProtector v

weixin_30315435的博客 713

C语言标准I/O库详解:文件操作与缓冲区机制

C语言标准I/O库详解:文件操作与缓冲区机制

weixin_66055196的博客 430

(二)OpenClaw-连接即时通讯平台-集成飞书完整配置指南

本文详细介绍了如何将OpenClaw与飞书机器人对接,实现通过飞书聊天窗口下达指令自动执行任务的高效协作模式。主要内容包括:1)OpenClaw服务部署验证和飞书账号准备;2)在飞书开放平台创建企业自建应用、添加机器人能力、获取凭证和开通必要权限;3)OpenClaw服务端的首次配置,包括设置飞书通道参数和启动长连接。文章提供了完整的操作步骤和截图指引,帮助用户快速完成对接配置,实现AI自动化助手功能。

直到世界的尽头 2246

MATLAB算法实战应用案例精讲-【数模应用】校准曲线(附MATLAB、python和R语言代码实现)

模型校准曲线(Calibration Curve),也称为可靠性曲线(Reliability Curve)或概率校准曲线(Probability Calibration Curve),是一种评估分类模型输出概率准确性的图形工具。它可以帮助我们理解模型的预测概率是否与实际标签的分布一致。校准曲线通常包括以下步骤:计算模型预测概率:对于测试集中的每个样本,模型会输出一个概率值,表示样本属于正类的概率。将数据分桶:将这些概率值分成若干个等宽的桶(例如10个桶),每个桶中的样本具有相似的预测概率。

qq_36130719的博客 557

C语言文件I/O函数详解:fprintf、fscanf、fgets、fputs、fwrite、fread、fseek、ftell、rewind

C语言的文件I/O函数提供了从简单文本处理到复杂二进制数据操作的全方位支持。理解函数特性:区分格式化、字符串和二进制操作正确使用模式:根据需求选择文本或二进制模式重视错误处理:检查所有I/O操作的返回值合理控制指针:使用fseekftellrewind精确定位注意资源管理:及时关闭文件,避免资源泄漏通过合理组合这些函数,可以高效处理各种文件操作需求,从配置文件读写到大数据文件处理都能游刃有余。

2601_96623467的博客 174

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C语言文件操作全解析:从基础函数到高效I/O策略

字符读写使用fgetc和fputc函数,字符串读写使用fgets和fputs函数,格式化读写则使用fscanf和fprintf函数。在Windows和Linux系统中,文件名规则有所不同,最大的区别在于大小写敏感性和部分特殊字符的使用限制。常见的模式包括只读"r"、写入"w"、追加"a"等,每种模式对应不同的文件操作权限和行为。文件结束判断不能仅依赖feof函数,应该结合具体读写函数的返回值进行综合判断。随机读写通过fseek、ftell和rewind函数实现,可以灵活定位文件指针位置,实现非顺序访问。

PurpleRain89的博客 875

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

从fseek/ftell到stat:一个文件大小查询功能引发的C语言I/O库深度游

本文深入探讨了C语言中查询文件大小的不同方法,从基础的fseek/ftell组合到系统调用stat,分析了它们的底层机制、性能差异及适用场景。特别关注了fseek与SEEK_END配合ftell获取文件大小的实现细节,并对比了stat函数在性能和功能上的优势,为开发者提供了实用的选择建议。

weixin_33676492的博客 252

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

用C语言手写Unix wc命令:从文件I/O到状态机

命令行工具是开发者的日常装备,而像wc这样看似简单的Unix命令,背后却交织着文件I/O、缓冲读取、命令行参数解析和文本状态机等核心编程概念。掌握这些原理不仅能让开发者写出更健壮的命令行程序,还能在代码行数统计、日志分析等实际场景中灵活运用。实现一个wc clone,需要理解其统计的是字符特征而非人类语义,正确区分行数、词数与字节数的边界条件,并通过分块缓冲读取优化大文件性能。本文以C语言为工具,手工实现一个类似wc的mywc程序,利用getopt解析参数,用状态机算法精准计数,并借助系统自带的wc进行差分

weixin_34356555的博客 307

C语言文件操作:从流抽象到二进制I/O的完整指南

在计算机编程中,输入输出(I/O)是程序与外部世界交互的基础。其核心原理是通过流(Stream)这一抽象层,将数据在内存与外部设备(如文件、网络)之间进行传输,从而屏蔽底层硬件差异。这一机制的技术价值在于提升开发效率、保证跨平台兼容性,并通过缓冲技术优化性能。在实际工程中,文件操作广泛应用于数据处理、配置管理、日志记录等场景。本文深入探讨C语言中基于FILE指针的I/O体系,涵盖文本与二进制流的本质区别、格式化I/O的安全实践,以及fread/fwrite等块操作函数在嵌入式系统等资源受限环境下的应用要点,

weixin_32050773的博客 239

从零实现Linux cat命令:C语言文件I/O与系统编程实战

文件I/O操作是系统编程的核心基础,它定义了程序与操作系统之间数据交换的机制。在Unix/Linux环境中,系统调用和标准I/O库提供了不同层级的文件访问接口,理解其缓冲机制和错误处理逻辑对构建健壮应用至关重要。通过实现cat这样的基础工具,开发者能深入掌握命令行参数解析、资源管理和跨平台兼容性等工程实践技能。本文聚焦C语言实战,以文件读取和错误处理为切入点,探讨如何用fopen/fread等函数构建可靠命令行程序,为学习更复杂的系统编程任务奠定基础。

weixin_31714129的博客 258

C语言文件编程完全指南:标准I/O函数与文件流操作

2.fgets读取遇到EOF会结束,遇到'\n'//'\n'会被读取到buffer中,读满size-1也会结束。从指定的文件中stream读取nmemb个元素,每个元素size大小的这么多个数据,存放到ptr指定的一块空间。fgets 和fputs 实现拷贝文件,对于二进制文件--问题很大,二进制文件中存储大量的\0。将ptr所在空间的nmemb个大小为size的元素,写到stream对应的文件中。关闭流指针,并且刷新流中的数据到指定位置 //关闭底层的文件描述符。⑥a+ 追加的读写。

kkkkkingw的博客 723

14.2【保姆级C语言入门】 标准I/O实战宝典:6大模块手把手教你搞定文件操作,新手直接上手!

本文详细介绍了C语言标准I/O的核心概念与实战技巧。主要内容包括: 命令行参数处理:讲解argc和argv的作用,通过快递下单的类比帮助理解,并提供参数检查的完整代码示例。 文件操作基础:重点解析fopen()函数的使用,包括各种打开模式的区别、错误处理方式,以及二进制文件的特殊处理。 字符级读写:介绍getc()和putc()函数的工作原理,解释为何使用int而非char作为返回值类型。 文章采用"生活场景+实战代码+逐行拆解+避坑指南"的方式,不仅讲解如何使用这些功能,更深入剖析背后

BackCatK Chen的博客 1382

【Linux】文件 I/O 操作详解:C语言库函数 vs 系统调用

本文对比分析了Linux系统中文件I/O操作的两种实现方式:C标准库函数和系统调用。标准库函数(如fopen、fread/fwrite)提供缓冲机制和跨平台兼容性,使用FILE*指针作为句柄;系统调用(如open、read/write)则直接与内核交互,效率更高但使用更复杂。文章详细介绍了两种方式在文件路径处理、打开模式、读写操作等方面的具体实现差异,并解释了进程工作目录、位标志参数传递等关键概念。建议开发者根据性能需求和开发效率,合理选择或结合使用这两种方式。理解这些底层原理有助于编写更高效可靠的I/O操

2403_87856518的博客 656

C语言实现代码行统计工具:状态机与文件I/O实战

文件I/O操作是系统编程与C语言学习的核心基础,涉及数据在内存与外部存储间的读写机制。其原理是通过操作系统提供的API(如fopen、fread、fwrite)建立数据流通道,实现对文件的顺序或随机访问。掌握文件I/O对于开发系统工具、处理日志和配置文件等场景具有重要技术价值,是构建实用命令行程序的关键。状态机作为一种经典的编程模型,通过定义有限状态和状态转移规则,能清晰处理复杂的流式数据解析问题,例如在编译器、网络协议分析和本文探讨的代码统计工具中广泛应用。本文将以一个经典的课程设计项目——用C语言实现增

weixin_33749242的博客 416
上一篇: C语言:构造类型
下一篇: 标准文件IO与系统文件IO
三道渊
博客等级 码龄3年 118粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值