25. 【C语言】二进制文件与随机读写

文件操作 目录: 1.什么是文件 2.文件名 3.文件类型 4.文件缓冲区 5.文件指针 6.文件的打开和关闭 7.文件的顺序读写 8.文件的随机读写 9.文件结束的判定 1.什么是文件 我们一般谈的文件有两种:程序文件、数据文件。 程序文件: 包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe) 数据文件: 文件的内容不一定是程序,而是... 阅读详情

上一篇文章我们学会了用 fprintf 和 fscanf 读写文本文件。文本文件最大的好处是可读——拿记事本打开就能看懂。但它也有明显的短板:存一个 double 要写成 "3.14159265358979" 这十几字节,读回来还要解析,精度可能损失,速度也慢。

如果你需要高效地存储大量数值,或者想快速跳到文件中间读写某条记录,那就得换另一种思路——把数据在内存中的样子原封不动地写入磁盘。这就是二进制文件。配合 C 语言提供的随机访问函数,你就能像操作数组一样操作文件中的任意位置。


一、二进制文件 vs 文本文件:底层都一样,解读方式不同

不管文本文件还是二进制文件,对于计算机来说都是 0 和 1 的字节流。区别只在于:你如何解读这些字节。

比如一个整数 123456789(十六进制 0x075BCD15),在内存中占 4 字节:

内存内容(小端): 15 CD 5B 07
  • 文本方式写入:fprintf(fp, "%d", 123456789); 会把它转换为字符串 "123456789",写出 9 个 ASCII 字符:31 32 33 34 35 36 37 38 39。
  • 二进制方式写入:fwrite(&n, sizeof(int), 1, fp); 直接把那 4 字节 15 CD 5B 07 写入文件。

优缺点对比:

文本文件二进制文件
可读性人可以直接看懂乱码(需要程序解读)
文件体积较大(数字越长越大)紧凑(固定大小)
读写速度慢(需要格式转换)快(直接搬移内存)
精度可能损失(浮点数)完全不损失
跨平台安全需注意字节序和类型大小

什么时候用二进制? 游戏存档、数据库文件、图像/音频/视频数据、大量传感器数据记录——只要数据量大、结构固定、不靠人眼阅读,就优选二进制。


二、fread 与 fwrite:读写“裸”数据块

这两个函数是二进制 I/O 的核心。

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
size_t fread (void *ptr, size_t size, size_t count, FILE *stream);
  • ptr:内存中数据的地址。
  • size:每个数据块的字节数(通常用 sizeof)。
  • count:要读写的数据块个数。
  • stream:文件指针。
  • 返回值:成功读/写的数据块个数(不是字节数!)。

写入二进制数据

把几个不同类型的数据一次写入文件:

#include <stdio.h>

int main(void) {
    FILE *fp = fopen("data.bin", "wb");  // 注意 "wb":二进制写模式
    if (fp == NULL) {
        perror("打开文件失败");
        return 1;
    }

    int    n = 42;
    double pi = 3.14159265;
    char   msg[] = "Hello";

    fwrite(&n,  sizeof(int),    1, fp);   // 写入一个 int
    fwrite(&pi, sizeof(double), 1, fp);   // 写入一个 double
    fwrite(msg, sizeof(char),   5, fp);   // 写入 5 个 char(不含 '\0')

    fclose(fp);
    return 0;
}

"wb" 中的 b 明确告诉操作系统“我是二进制模式”。在 Linux/macOS 上 "w" 和 "wb" 没有实际区别,但 Windows 上文本模式会自动把 \n 转换为 \r\n,二进制模式则不会。为了跨平台,写二进制一定要加 b。

读取二进制数据

#include <stdio.h>

int main(void) {
    FILE *fp = fopen("data.bin", "rb");
    if (fp == NULL) {
        perror("打开文件失败");
        return 1;
    }

    int    n;
    double pi;
    char   msg[6] = {0};   // 多留一位给 '\0'

    fread(&n,  sizeof(int),    1, fp);
    fread(&pi, sizeof(double), 1, fp);
    fread(msg, sizeof(char),   5, fp);

    printf("n=%d, pi=%.8f, msg=%s\n", n, pi, msg);
    fclose(fp);
    return 0;
}

读取的顺序和类型必须与写入时严格一致。如果读的类型对不上,结果将是垃圾值。

检查 fread 的返回值

fread 可能读不到你期望的数量(文件损坏、意外结束)。应该检查返回值:

size_t read_count = fread(&n, sizeof(int), 1, fp);
if (read_count != 1) {
    printf("读取失败或文件结束\n");
}

三、结构体 + 二进制 = 天然绝配

结构体的内存布局是连续的(考虑对齐),因此可以一次性把整个结构体写入或读出,极其方便。

#include <stdio.h>

typedef struct {
    char name[20];
    int  id;
    float score;
} Student;

int main(void) {
    // 写入
    FILE *fp = fopen("students.bin", "wb");
    Student s1 = {"Alice", 1001, 92.5};
    Student s2 = {"Bob",   1002, 85.0};
    fwrite(&s1, sizeof(Student), 1, fp);
    fwrite(&s2, sizeof(Student), 1, fp);
    fclose(fp);

    // 读取
    fp = fopen("students.bin", "rb");
    Student students[10];
    int count = 0;
    while (fread(&students[count], sizeof(Student), 1, fp) == 1) {
        count++;
    }
    fclose(fp);

    for (int i = 0; i < count; i++) {
        printf("%s %d %.1f\n", students[i].name, students[i].id, students[i].score);
    }
    return 0;
}

注意:如果结构体中有指针成员(比如 char *name),不能直接 fwrite。因为写入的是指针的值(一个地址),而不是指针指向的内容,读回来时那个地址早已无效。包含指针的结构体需要手动序列化(逐个成员处理)。


四、随机访问:在文件中“跳来跳去”

到目前为止,我们读写文件都是顺序的——从头往后,不能回头,不能直接定位。但很多时候我们想直接跳到第 100 条记录、或者回到开头重读。这就需要随机访问。

每个文件流内部维护一个当前位置指示器,记录下一次读写将在哪个字节偏移处进行。C 语言提供了三个关键函数来操作它。

1. fseek:定位到指定位置

int fseek(FILE *stream, long offset, int whence);
  • stream:文件指针。
  • offset:偏移量(字节),正数向后移,负数向前移。
  • whence:参照点,可选:
    • SEEK_SET:文件开头
    • SEEK_CUR:当前位置
    • SEEK_END:文件末尾

示例:

fseek(fp, 0, SEEK_SET);          // 回到文件开头
fseek(fp, sizeof(Student) * 5, SEEK_SET);  // 跳到第 6 个学生(索引 5)
fseek(fp, 0, SEEK_END);          // 跳到文件末尾
fseek(fp, -100, SEEK_END);       // 从文件末尾往前退 100 字节
fseek(fp, 10, SEEK_CUR);         // 从当前位置往后跳 10 字节

返回值:成功返回 0,失败返回非 0。

2. ftell:获取当前位置

long ftell(FILE *stream);

返回当前字节偏移(从文件开头算起),出错返回 -1L。

fseek(fp, 0, SEEK_END);
long file_size = ftell(fp);  // 文件大小(字节数)

3. rewind:快捷回到开头

rewind(fp);

等价于 fseek(fp, 0, SEEK_SET);,但同时会清除文件流的错误标志。


五、实战:小型学生信息管理系统(二进制存储 + 随机读写)

把结构体、动态内存、随机访问结合,做一个完整的小型管理系统。数据以二进制存储,支持添加、列表、修改、查找、删除功能。

student_system.c

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

#define FILENAME "students.dat"
#define MAX_NAME 20

typedef struct {
    char name[MAX_NAME];
    int  id;
    float score;
} Student;

// 追加一个学生记录
void add_student(void) {
    FILE *fp = fopen(FILENAME, "ab");
    if (fp == NULL) {
        perror("打开文件失败");
        return;
    }

    Student s;
    printf("姓名 学号 成绩: ");
    scanf("%s %d %f", s.name, &s.id, &s.score);
    fwrite(&s, sizeof(Student), 1, fp);
    fclose(fp);
    printf("已添加。\n");
}

// 列表所有学生
void list_students(void) {
    FILE *fp = fopen(FILENAME, "rb");
    if (fp == NULL) {
        printf("暂无记录。\n");
        return;
    }

    Student s;
    int count = 0;
    printf("---- 学生列表 ----\n");
    while (fread(&s, sizeof(Student), 1, fp) == 1) {
        printf("#%d: %s, 学号=%d, 成绩=%.1f\n", count, s.name, s.id, s.score);
        count++;
    }
    if (count == 0) printf("(无记录)\n");
    fclose(fp);
}

// 根据学号查找
int find_student_by_id(int target_id, Student *out) {
    FILE *fp = fopen(FILENAME, "rb");
    if (fp == NULL) return -1;

    int index = 0;
    while (fread(out, sizeof(Student), 1, fp) == 1) {
        if (out->id == target_id) {
            fclose(fp);
            return index;  // 返回记录索引
        }
        index++;
    }
    fclose(fp);
    return -1;
}

// 修改学生成绩
void update_score(void) {
    int target_id;
    printf("输入要修改的学号: ");
    scanf("%d", &target_id);

    FILE *fp = fopen(FILENAME, "r+b");  // 二进制读写模式
    if (fp == NULL) {
        printf("文件不存在。\n");
        return;
    }

    Student s;
    long pos;
    int found = 0;
    while ((pos = ftell(fp)) >= 0 && fread(&s, sizeof(Student), 1, fp) == 1) {
        if (s.id == target_id) {
            printf("当前成绩: %.1f,新成绩: ", s.score);
            scanf("%f", &s.score);
            fseek(fp, pos, SEEK_SET);   // 回到这条记录的开头
            fwrite(&s, sizeof(Student), 1, fp);  // 覆盖写入
            found = 1;
            break;
        }
    }
    fclose(fp);
    printf(found ? "修改成功。\n" : "未找到该学号。\n");
}

// 删除学生(通过创建新文件并跳过删除项)
void delete_student(void) {
    int target_id;
    printf("输入要删除的学号: ");
    scanf("%d", &target_id);

    FILE *fp = fopen(FILENAME, "rb");
    if (fp == NULL) {
        printf("文件不存在。\n");
        return;
    }

    FILE *temp = fopen("temp.dat", "wb");
    if (temp == NULL) {
        perror("临时文件创建失败");
        fclose(fp);
        return;
    }

    Student s;
    int found = 0;
    while (fread(&s, sizeof(Student), 1, fp) == 1) {
        if (s.id == target_id) {
            found = 1;   // 跳过这条记录
        } else {
            fwrite(&s, sizeof(Student), 1, temp);
        }
    }
    fclose(fp);
    fclose(temp);

    remove(FILENAME);
    rename("temp.dat", FILENAME);
    printf(found ? "删除成功。\n" : "未找到该学号。\n");
}

int main(void) {
    int choice;
    while (1) {
        printf("\n1.添加  2.列表  3.查找  4.修改  5.删除  0.退出\n");
        printf("选择: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1: add_student(); break;
            case 2: list_students(); break;
            case 3: {
                int id;
                printf("输入学号: ");
                scanf("%d", &id);
                Student s;
                int idx = find_student_by_id(id, &s);
                if (idx >= 0) printf("找到: %s 成绩 %.1f\n", s.name, s.score);
                else printf("未找到。\n");
                break;
            }
            case 4: update_score(); break;
            case 5: delete_student(); break;
            case 0: return 0;
            default: printf("无效选项。\n");
        }
    }
}

重点分析:

  • 追加:用 "ab" 模式,新记录自动加在末尾。
  • 修改:用 "r+b" 模式,先用 ftell 记录读取位置,读到目标后,用 fseek 回退到该位置,再 fwrite 覆盖。这就用到了随机定位。
  • 删除:因为从文件中“挖掉”一块很难,常用策略是创建临时文件,把要保留的记录复制过去,跳过目标,再替换原文件。这也是随机读写的一种变通应用。

六、常见错误与陷阱

1. 忘记 b 模式(Windows 下最要命)

fopen("data.bin", "w");  // Windows 下会把 0x0A 变成 0x0D 0x0A

在 Windows 上,文本模式会转换换行符,破坏二进制数据。写二进制文件永远加 b。

2. 读写的结构体包含指针

typedef struct {
    char *name;  // 指针!
    int id;
} Bad;
fwrite(&bad, sizeof(Bad), 1, fp);  // 写入的是指针值,不是字符串

包含指针的结构体不能直接二进制读写。只对不含指针的“纯数据”结构体使用。

3. 对 fread 返回值检查不足

fread(&s, sizeof(Student), 5, fp);  // 期望读 5 个,实际可能只读 3 个

永远用返回值判断实际读到了多少块。

4. fseek 偏移量计算错误

fseek(fp, 5, SEEK_SET);  // 跳到第 5 字节,不是第 5 个记录!

若想跳第 n 条记录,偏移量应为 n * sizeof(Student)。

5. 跨平台字节序和大小不一致

一台机器上写入的二进制文件,另一台可能读出来是错的(比如大端 vs 小端,int 4 字节 vs 2 字节)。如果要在不同平台间交换二进制数据,需要设计固定的字节序和类型大小(如使用 int32_t 进行序列化)。


七、小结

今天你打开了文件操作的另一半世界:

  • 二进制 I/O:fwrite 和 fread 直接搬移内存,高效紧凑,与结构体配合尤其方便。
  • 随机访问:fseek 让你在文件中任意定位,ftell 告诉你当前位置,rewind 一键回开头。
  • 实战组合:用二进制 + 随机读写实现了学生信息的增、查、改、删,体验了“文件即数据库”的雏形。

现在你对文件操作已经有了相当全面的掌握。但 C 语言还有一个非常强大却容易被滥用的部分——预处理器。从下一篇开始,我们将进入预处理指令的世界:宏定义的技巧与陷阱,条件编译如何让一套代码适配多平台,以及 #include 背后更深层的管理艺术。准备好了吗?


课后小练习

  1. 写一个程序,用二进制方式把 100 以内的所有偶数写入 evens.bin,然后再读取回来验证数据是否正确。
  2. 用 fseek 和 ftell 实现一个函数 long file_size(const char *filename),返回文件的大小(字节数)。如果文件不存在,返回 -1。
  3. 在上面的学生管理系统中增加一个“交换第 i 和 第 j 条记录”的功能:通过 fseek 定位两条记录,读取到内存,然后交换并写回。
  4. (小挑战)设计一个简单的“键值数据库”文件格式:每条记录是 int key + int value。实现 put(key, value) 和 get(key) 操作。提示:可以将整个文件读入数组,在内存中查找/修改,再写回;或者用 fseek 随机遍历。哪种方式更高效?什么时候用哪一种?

我们下期见!

💡获取本系列示例代码请访问 GitCode 仓库。

保姆级教程:在Windows/Mac上从零部署清华Kronos股票预测模型(含Qlib数据更新避坑指南) 本文提供了一份详细的指南,帮助用户在Windows和Mac系统上从零部署清华Kronos股票预测模型,包括环境配置、模型权重获取、Qlib数据更新避坑等关键步骤。特别针对国内用户遇到的网络问题和数据更新不及时提供了解决方案,适合量化投资和金融科技爱好者快速上手。 阅读详情

相关推荐

长短期记忆网络(Long Short-Term Memory networks, LSTM)

如何简单的理解LSTM——其实没有那么复杂:

weixin_39910711的博客 2万+

【c语言】二进制文件的读写操作

一、二进制文件写操作fwrite 1.存储一个整型变量 2.存储一个数组 3.存储一个字符串 二、二进制文件读操作fread 1.读取整数 2.读取一个数组

努力让自己的能力配得上梦想. 8767

PX4 EKF2协方差矩阵‘负定’了怎么办?保姆级排查与数值稳定性修复指南

本文深入解析PX4 EKF2协方差矩阵出现‘负定’问题的原因,并提供全面的排查与修复方案。从理论分析到实践操作,详细介绍了数值稳定性危机的诊断工具、算法加固措施及工程实践中的防御性编程技巧,帮助飞控工程师有效解决滤波算法中的数值稳定性问题。

weixin_28730927的博客 317

C语言 二进制文件的读写

从键盘读入10个浮点数,以二进制形式存入文件中;再从文件中读出数据显示在屏幕上。修改文件中第n个数据,修改的数据从键盘读入;再从文件中读出数据显示在屏幕上,以验证修改的正确性。2)读取后显示的10个浮点数在一行显示,两个数之间用一个空格分隔。1)输出的数据保留小数点后两位;

weixin_74287172的博客 909

华为云Stack交付实战:从工勘到上线的全流程拆解

本文详细拆解华为云Stack交付全流程,从项目启动、工勘、LLD设计到硬件部署和软件安装,提供实战技巧与避坑指南。重点解析华为云Stack交付流程中的关键环节,如标准化工具使用、规范化文档管理和流程化协作,帮助团队高效完成从工勘到上线的复杂项目交付。

weixin_29243063的博客 155

图像分割 - 使用Mask R-CNN模型在COCO数据集上进行图像分割任务

图像分割是计算机视觉领域的一个重要任务,它旨在将图像中的每个像素分类为对象或背景。Mask R-CNN是一种基于区域的卷积神经网络,可用于图像分割任务。它是Faster R-CNN的扩展,将目标检测与图像分割结合起来,能够同时检测和分割对象。在本博客中,我们将使用Mask R-CNN模型在COCO数据集上进行图像分割任务。我们将介绍如何下载和准备COCO数据集,以及如何使用Mask R-CNN模型进行训练和推理。

斌擎科技 1188

C语言读写二进制文件

可以这么说,除了文本文件以外的所有文件都是二进制文件。二进制文件相对于文本文件更容易修改。因为文本文件的修改,需要修改以后写入内存,然后再清空原文件,再从内存中读取出修改以后的内容到本文件中。二进制文件修改只需要找到特定的字符,然后对它进行修改。 对二进制文件进行操作主要用到fopen,fread,fwrite,fseek等函数。 完整代码: #include #include

qicheng777的博客 2万+

OpenClaw 超级 AI 实战专栏【模型推理与实战】(二)官方预训练模型下载与使用

OpenClaw 预训练模型需按「固定目录结构」存放(模型文件夹包含权重 + 配置文件),否则会加载失败;核心流程:下载模型→验证文件完整性→加载模型→传入图片执行推理→可视化结果;常见问题集中在「路径错误」「显存不足」「文件缺失」,按文中方案可快速解决。

qq_36130719的博客 307

如何进行二进制文件的读写操作?

进行二进制文件的读写操作是C语言中的常见任务。在处理文件时,您需要打开文件、读取数据、写入数据和关闭文件。使用标准C库函数,如fopenfreadfwrite和fclose,您可以轻松地执行这些操作。同时,要时刻注意错误处理,以确保文件操作不出现问题。二进制文件的读写操作是处理各种文件和数据的关键部分,掌握这些技巧对于C程序员来说非常重要。希望这篇文章对您有所帮助。

weixin_68551689的博客 4290

预编码算法(个人总结)

预编码算法是无线通信系统中的关键技术,通过在发送端对信号进行处理,可以有效减少干扰,提高系统性能。预编码算法在5G、Wi-Fi、卫星通信等领域具有广泛的应用前景,同时,随着深度学习、大规模MIMO和物理层安全等技术的发展,预编码算法的研究将进一步推动无线通信技术的发展。CSI的准确性直接影响到预编码的效果。预编码是一种在发送端对信号进行线性变换的技术,以优化信号的空间分布,使得接收端能够更好地接收和解码信号。预编码算法,特别是基于矩阵分解的预编码算法,计算复杂度较高,限制了其在实际系统中的应用。

年糕的博客 5287

600份国家自然基金申报书--模板

600份国家自然基金申报书--模板

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 4186

【C语言】文件操作详解

磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

weixin_66400112的博客 945

n8n AI高效工作流自动化 部署使用教程

摘要: n8n是一款开源可视化工作流自动化工具,结合AI能力可高效解决重复性任务。文章详细介绍了从Docker部署到实战应用的完整流程:1)通过Docker Compose自托管n8n,确保数据可控;2)以AI客服日报机器人为例,演示如何串联工单系统、ChatGPT和邮件通知,实现定时自动化;3)进阶搭建交互式AI助手,利用ToolsAgent节点调用业务API;4)整合向量数据库构建RAG知识库问答。关键建议包括:拆分复杂工作流、严格管理凭据、区分开发与生产环境,并建议从高频刚性需求(如日报生成)切入,逐

专注AI大模型,软件混淆,授权 264

C语言:随机读写文件、实现文件复制功能

前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据。但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写。这种读写方式称为随机读写,也就是说从文件的任意位置开始读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位函数 rewind 和 fseek移动文件内部位置指针的函数主要有两个,即 rewind() 和 fseek()。参数说明:fp 为文件指针,也就是被移动的文件。

Dola的博客 1156

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

c语言 文件指针移动一位,c语言怎样移动文件指针到制定位置?

格式化读写函数fscanf和fprintffscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为: fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列); 例如:fscanf(f...

weixin_36298476的博客 5898

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从C语言来理解文件系统

文章目录一、文件、文件系统二、C语言文件操作详解C语言中的文件是什么?文件流C语言fopen函数的用法,C语言打开文件详解fopen() 函数的返回值判断文件是否打开成功fopen() 函数的打开方式关闭文件实例演示文本文件和二进制文件到底有什么区别?文本文件和二进制文件的区别fopen() 中的文本方式和二进制方式C语言fgetc和fputc函数用法详解(以字符形式读写文件)字符读取函数 fgetc对 EOF 的说明字符写入函数 fputc两点说明C语言fgets和fputs函数的用法详解(以字符串的形式

qq_41854911的博客 1453

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C语言系列(25)——文件操作

C语言系列(25)——文件操作一、为什么需要文件二、什么是文件三、文件基本操作1. 打开文件2. 写入文件3. 读取文件4. 关闭文件四、随机读写1. rewind 函数:2. ftell 函数:3. fseek 函数:五、文件操作示例: 一、为什么需要文件 硬盘上持久化的保存数据。(读档、存档) 二、什么是文件 存储路径, 如:E:\image 文件名, 如:test 后缀名...

jiabin12230的博客 542

C语言文件读写

每个打开的文件都有一个指针记录这读写操作的位置,它会随着读写函数的执行而自动移动,所以以r、r+、w、w+方式打开文件位置指针默认在文件开头,以a、a+方式打开文件位置指针默认在文件末尾。平时顺序读写时不用关注位置指针,当需要随机读写文件时可以通过手动设置文件指针的位置来进行。是人能看得懂的文件,存储的是字符符号的ASCII码的二进制 ‘2’ ‘5’ ‘5’返回值:文件指针(结构指针),不需要关心它的成员,只需要知道它是操作文件的凭证。注意:文件读写有有缓冲区机制,想要立即写入,需要关闭文件后才能看到。

weixin_52955026的博客 173

C语言:文件随机读写函数

编写程序,将一个浮点数写入磁盘文件后,再将其读出显示出来。 # include <stdio.h> void main() { FILE * fp8,fp9; float fdata1 = 25.68,fdata2; if ((fp8 = fopen (″ datafile8 ″,″ wb ″))== NULL)  /* 打开文件 */ {  printf (″cannot open the file .\ n ″); exit (1);

零小唬的博客 492

C语言文件操作全指南:文件读写、随机访问与缓冲区机制

本文介绍C语言文件操作:讲解文件分类(程序/数据文件)、文本与二进制文件区别,介绍流、标准流及文件指针,详解fopen/fclose及顺序读写函数,演示fseek等随机访问,说明feof正确用法,最后剖析缓冲区机制对读写的影响。

Tim_tan666的博客 234

C语言程序设计精髓 第15周——学会保存你的数据 练兵区——单选题

1单选(1分) 下面的程序执行后,文件test中的内容是 #include <stdio.h> #include <string.h> void Fun(char *fname,char *st) { FILE *myf; int i; myf=fopen(fname,"w" ); if (myf == NULL) { printf("cannot open the file.\n"); exit(0); }

听维也纳的海风 1811

【C语言刷题】文件操作章节配套练习(选择题 + 编程题)

本篇为《维生素C语言》系列配套练习题,挑选了一些相对来说比较实用的练习,有助于巩固学习的知识。题目附带了答案和解析可供参考,顺便附上文件操作教学链接,可供复习:

有道无术, 术尚可求。有术无道, 止于术。 1万+

python读取dat数据_dat文件读写_c语言读写dat文件_c语言读dat文件 - 云+社区 - 腾讯云...

广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!13 }文件读写:写入目录的获取比较麻烦,各个平台不同,所以用c++自己的文件读写行不通。 使用cocos2d-x自己的文件读写:当前程序的文档目录initplist文件...attr = attr->next()){18 str += attr->name(); 19 ...

weixin_39814126的博客 743

C语言文件操作例子

<br />#include<stdio.h> <br />main(int argc,char *argv[]) <br />{ <br />FILE *fp1,*fp2; <br />char ch; <br />if(argc==1) <br />{ <br />printf("have not enter file name strike any key exit"); <br />getch(); <br />exit(0); <br />} <br />if((fp1=fopen(argv[1]

zeng622peng的专栏 1万+

【C语言】《C 文件操作从入门到精通:标准流、FILE*、fseek 与缓冲区机制》

从程序设计的角度,文件分为程序文件和数据文件函数名功能适用于fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets文本行输入函数所有输入流fputs文本行输出函数所有输出流fscanf格式化输入函数所有输入流fprintf格式化输出函数所有输出流fread二进制输入文件输入流fwrite二进制输出文件输出流上⾯说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);

2501_93351213的博客 874

c语言题库之判断题

1、C 语言具有简洁明了的特点。(1分) 正确 2、预处理命令的前面必须加一个“#”号。(1分) 正确 3、标准格式输入函数scanf()可以从键盘上接收不同数据类型的数据项。(1分) 正确 4、在if语句的三种形式中,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。(1 分) 正确 5、continue 不是结束本次循环,而是终止整个循环的执行。(1分)...

qq_43495683的博客 2万+
上一篇: 24. 【C语言】把数据存下来:文件操作基础
下一篇: 26. 【C语言】编译前的“文本大师”:预处理器指令
gugucoding
博客等级 码龄140天 7粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值