24. 【C语言】把数据存下来:文件操作基础

C语言基础知识入门大全 C语言入门知识 阅读详情

前面二十三篇文章,我们写的所有程序都有一个共同特征:数据只在运行时存在。变量在内存里,程序一退出,一切烟消云散。

但真正的软件不是这样的。游戏要保存存档,编辑器要读写文档,数据库要把数据永久保存到磁盘。这就需要一个程序与外部存储世界沟通的桥梁——文件操作。

C 语言通过标准库提供了一套简洁的文件操作函数,核心思路是:把文件看作一个字节流,打开它、读/写它、关闭它。今天我们就来掌握这套“磁盘功夫”。


一、文件指针 FILE *:操作文件的“手柄”

在 C 语言里,操作文件不是靠文件名,而是靠一个文件指针——FILE *。你打开一个文件,操作系统会返回一个不透明的指针,之后所有的读写操作都通过这个指针进行。

可以把 FILE * 理解为“遥控器”:你用它来操控对应的文件,不需要知道内部细节。

#include <stdio.h>

int main(void) {
    FILE *fp;  // 声明文件指针
    fp = fopen("test.txt", "w");  // 打开文件
    // ... 使用 fp ...
    fclose(fp);  // 关闭文件
    return 0;
}

二、打开文件:fopen

FILE *fopen(const char *filename, const char *mode);
  • filename:文件路径(字符串)。
  • mode:打开模式(字符串),决定读还是写、是否清空、是否追加等。
  • 返回值:成功返回 FILE*,失败返回 NULL。

常用模式一览

模式含义文件不存在时文件存在时
"r"只读返回 NULL从头读
"w"只写创建新文件清空内容,从头写
"a"追加写创建新文件从末尾追加,不清空
"r+"读写返回 NULL从头读写
"w+"读写创建新文件清空内容
"a+"读+追加创建新文件从末尾追加

永远检查 fopen 的返回值:如果文件打不开(比如路径不存在、权限不够、磁盘满),fopen 返回 NULL。不检查就直接用,会导致空指针解引用,程序崩溃。

FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
    perror("打开文件失败");  // perror 打印系统错误信息
    return 1;
}

perror 是个很方便的函数,它会根据全局错误码 errno 打印出具体的错误原因(比如 “No such file or directory”)。


三、关闭文件:fclose

int fclose(FILE *fp);
  • 将缓冲区中尚未写入磁盘的数据刷新到文件。
  • 释放系统资源(文件描述符)。
  • 返回 0 表示成功,EOF(通常是 -1)表示失败。

省略 fclose 在程序正常退出时,操作系统通常会帮你关掉。但养成手动关闭的习惯非常必要——尤其是写操作,不关可能导致数据丢失;长期运行的程序不关会耗尽文件描述符。


四、写文件:fprintf 和 fputs

1. fprintf —— 格式化写入

fprintf 和 printf 几乎一模一样,只是多了一个 FILE* 参数指明写入到哪里。

fprintf(fp, "格式字符串", 参数...);

示例:把学生信息写入文件

#include <stdio.h>

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

    fprintf(fp, "%-20s %-10s %-6s\n", "姓名", "学号", "成绩");
    fprintf(fp, "%-20s %-10d %-6.1f\n", "Alice", 1001, 92.5);
    fprintf(fp, "%-20s %-10d %-6.1f\n", "Bob", 1002, 85.0);
    fprintf(fp, "%-20s %-10d %-6.1f\n", "Carol", 1003, 78.5);

    fclose(fp);
    printf("数据已写入 students.txt\n");
    return 0;
}

运行后打开 students.txt,你会看到格式整齐的表格。%-20s 表示左对齐占 20 列,和终端输出完全一样。

2. fputs —— 写入整个字符串

fputs("一行文字\n", fp);

比 fprintf(fp, "%s", str) 更简洁,但不带格式化功能,也不会自动加换行(你需要手动 \n)。


五、读文件:fscanf 和 fgets

1. fscanf —— 格式化读取

和 scanf 类似,从文件指针读取而非键盘:

fscanf(fp, "格式字符串", 地址...);

读回刚才保存的学生数据:

#include <stdio.h>

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

    char name[50];
    int id;
    float score;

    // 跳过标题行
    char header[100];
    fgets(header, sizeof(header), fp);

    printf("读取的学生数据:\n");
    while (fscanf(fp, "%s %d %f", name, &id, &score) == 3) {
        printf("姓名: %s, 学号: %d, 成绩: %.1f\n", name, id, score);
    }

    fclose(fp);
    return 0;
}

注意:fscanf 遇到空格、换行会停止读字符串。如果 name 包含空格,会被截断——这时用 fgets 逐行读更可靠。

判断读取是否结束:fscanf 的返回值是成功匹配并赋值的项数。读到文件末尾返回 EOF(通常是 -1),匹配失败返回小于期望值的数。

2. fgets —— 安全地读一行

char *fgets(char *buffer, int size, FILE *fp);
  • buffer:存放读取内容的字符数组。
  • size:最多读取 size-1 个字符(留一位给 '\0')。
  • 读到换行符会保留它,读到文件末尾返回 NULL。
char line[256];
while (fgets(line, sizeof(line), fp) != NULL) {
    printf("%s", line);  // line 里已包含换行符
}

fgets 不会溢出,是读取文本文件的推荐方式。


六、文本文件 vs 二进制文件

上面的例子都是文本文件——数据以人类可读的字符形式存储,数字 92.5 被写成 ‘9’ ‘2’ ‘.’ ‘5’ 四个字符。文本文件优点是直接用编辑器打开查看,缺点是有转换开销、精度可能丢失、文件较大。

二进制文件则把内存中的位模式原样写入磁盘。int 就写 4 字节,double 写 8 字节。优点:更紧凑、读写更快、精度不丢失。缺点:用编辑器打开是乱码。

我们现在先只关注文本文件(下一篇文章会系统讲 fread/fwrite 的二进制操作)。现在你只需知道,C 把文件都看作字节流,文本和二进制只是解释方式不同。


七、完整实战:学生成绩文件的读写

把结构体(第二十一篇)和文件操作结合起来,做一个简单的成绩单保存/读取工具。

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

#define MAX_NAME 50
#define FILENAME "grades.txt"

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

void save_students(Student *students, int count) {
    FILE *fp = fopen(FILENAME, "w");
    if (fp == NULL) {
        perror("保存失败");
        return;
    }
    fprintf(fp, "%d\n", count);  // 第一行记录学生数量
    for (int i = 0; i < count; i++) {
        fprintf(fp, "%s %.1f\n", students[i].name, students[i].score);
    }
    fclose(fp);
    printf("已保存 %d 条记录到 %s\n", count, FILENAME);
}

int load_students(Student *students, int max_count) {
    FILE *fp = fopen(FILENAME, "r");
    if (fp == NULL) {
        perror("加载失败");
        return 0;
    }

    int count;
    fscanf(fp, "%d", &count);
    if (count > max_count) count = max_count;

    for (int i = 0; i < count; i++) {
        fscanf(fp, "%s %f", students[i].name, &students[i].score);
    }
    fclose(fp);
    return count;
}

int main(void) {
    Student students[100];
    int count = 0;
    int choice;

    while (1) {
        printf("\n1.添加学生  2.显示全部  3.保存  4.加载  0.退出\n");
        printf("选择: ");
        scanf("%d", &choice);

        if (choice == 0) break;
        else if (choice == 1) {
            if (count >= 100) {
                printf("已满\n");
                continue;
            }
            printf("姓名 成绩: ");
            scanf("%s %f", students[count].name, &students[count].score);
            count++;
        }
        else if (choice == 2) {
            printf("当前 %d 条记录:\n", count);
            for (int i = 0; i < count; i++) {
                printf("  %s: %.1f\n", students[i].name, students[i].score);
            }
        }
        else if (choice == 3) {
            save_students(students, count);
        }
        else if (choice == 4) {
            count = load_students(students, 100);
            printf("已加载 %d 条记录\n", count);
        }
    }
    return 0;
}

这个程序综合了结构体、数组、循环、分支、文件读写。运行它,添加几个学生,保存后退出;再重新运行,加载文件,数据就恢复了——你第一次实现了真正的“持久化”。


八、常见错误与陷阱

1. 忘记检查 fopen 的返回值

FILE *fp = fopen("missing.txt", "r");
fprintf(fp, "hello");  // fp 是 NULL,崩溃

任何文件操作前先判空。

2. 用 "w" 打开已有文件,内容被清空

FILE *fp = fopen("important.txt", "w");  // 旧内容瞬间消失!

如果只是想添加,用 "a"(追加)模式。

3. 读写后忘记 fclose

尤其是在写操作后,不关可能导致缓冲区里的数据还没写到磁盘,造成文件内容不完整。

4. 用 fscanf 读字符串不限制宽度

char name[20];
fscanf(fp, "%s", name);  // 文件里若有一行超长,就溢出了

应该用 %19s 限制宽度,或者用 fgets。

5. 多次调用 fgets / fscanf 时没考虑上一行的换行符残留

fscanf(fp, "%d", &n);    // 读完数字,换行符还在
fgets(line, 100, fp);    // 立即读完那个换行符,得到空行

混合使用 fscanf 和 fgets 时,可以在 fscanf 后用 getchar() 或 fgetc(fp) 吃掉换行符。或者统一用 fgets + sscanf 解析。


九、小结

今天你让程序有了“记忆力”。核心知识:

  • FILE * 是操作文件的手柄,用 fopen 获取,用 fclose 归还。
  • "r"、"w"、"a" 等模式控制了读、写、追加行为。
  • fprintf / fputs 写文件,fscanf / fgets 读文件。
  • fgets 是安全读行的首选,混合输入时要小心换行符残留。
  • 结构体 + 文件操作 = 简单的数据持久化系统。

文本文件足以应对配置、日志、简单数据存储的需求。但如果你想高效存储大量数值、实现随机读写、或者构建一个简易数据库文件,就需要二进制文件与随机读写。下一篇,我们就来学习 fread、fwrite、fseek、ftell——打开文件操作的另一扇大门。


课后小练习

  1. 编写一个程序,把 1 到 100 的整数逐行写入 numbers.txt,每行一个数。
  2. 读取上一题生成的 numbers.txt,计算所有整数的总和并打印。
  3. 实现一个简单的“日志记录器”:每次运行程序,让用户输入一行文字,以追加模式写入 log.txt,并在每行前加上时间戳(可以用 time 库的 time() 和 ctime() 获取当前时间字符串)。
  4. (陷阱题)下面的代码有什么问题?如何修正?
    FILE *fp = fopen("data.txt", "w");
    if (fp = NULL) {
        printf("错误\n");
    }
    fprintf(fp, "Hello");
    fclose(fp);
    

我们下期见!

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

24点游戏C语言(附源代码) 在24点游戏中,随机生成4个 数,让用户对这4个数进行四则运算,对用户输入进行判断,若结果为24,则生命值不变,分数加10,将结果存入文件,并以排行榜的方式打开。 首先进行四个数的随机输出(给定的范围是1到13),用rand()函数 实现。 {            printf("你要计算的四个数是:"); num1=(rand()%13+1); printf("%d  ",num 阅读详情

相关推荐

24c512 c语言程序,24C32~24C512的51单片机读写程序

24C32~24C512的51单片机读写程序来源:--作者:--浏览:3875时间:2016-08-10 14:18标签:摘要:AT89S52晶振频率为11.0592MHz指令周期:1.0852us 功能说明:24C32-512程序,能读写:24C32、24C64、24C128、24C256、24C512 读出的数据送P1口显示 #include"reg52.h" #include"...

weixin_39581318的博客 1218

C语言:文件操作集合,干货满满!

文件操作—知识点小集结啥是文件文件的分类文件名文件类型二级目录三级目录 啥是文件 我们之前说过要实现通讯录的第三次升级,即文件版本的通讯录。那么为啥要有文件版本的呢?因为我们平时在使用通讯录这样的程序的时候,我们不能每次打开都是从头输入联系人吧。因此,这也是为什么我们需要将文件操作加入通讯录中,是为了让我们的程序不只是一次性的,也具有保存数据的功能。 好了,说了一下大概的用途,我们就来了解一下啥是文件吧 文件的话,广义的说,磁盘上的东西都可以成为文件 文件的分类 那么在我们的程序设计里面,我们将文件分成程序

weixin_51306225的博客 3477

C语言24位数据转换为32位

codeblocks测试工程下载:https://www.lanzous.com/i2u7tjc 一般情况下,ADC与单片机的通讯方式都是串行的,可能是IIC、SPI等。假设现在有一个24位的ADC,那么在正常工作时,单片机将依次接收到24bit的数据。ADC的数据是24位的,但是没有24位的数据类型。在单片机中,int类型的数据一般是32位的。所以需要一个函数来完成两者的转换。 首先我...

zhoodn的博客 7390

C语言每日一练——第70天:24点问题

C语言每日一练 2021年12月29日——24点问题——分析:这道题理解起来很简单,就是拼凑加减乘除,使4个数的运算结果等于24。 由于四则运算中,乘除的优先级高于加减,所以必须“加括号”来限定4个数之间运算优先级。 例如:A+B*C-D 这个式子,通过增加括号,可以产生多种结果,比如 (A+B)*(C-D) 和 A+(B*C-D)。 那么总共有几种加括号的方法呢,该如何分类呢? 一开始我在想是不是能按照括号对数进行分类,但后来发现,要想将4个数字的运算优先级细分,必须使用两对括号。

Super辉sir的博客 2万+

【C语言】带你重新温习一遍C语言,这些基础C语言知识你都了解吗?

目录 1. 常量、变量、数据类型 2. 运算符与表达式 3. 基本语句 4. 选择结构 5. 循环结构 6. 数组 7. 函数 8. 指针 9. 编译预处理和动态存储分配 10. 结构体与共用体 11. 文件 12. 综合运用 — 学生成绩管理系统设计 1. 常量、变量、数据类型 源程序有一个或者多个函数构成,每个函数完成相对独立的功能。 一个C语言程序中有且只有一个...

Fanjufei的博客 1951

C语言编程实践:24点游戏开发

本文还有配套的精品资源,点击获取 简介:C语言作为计算机科学的基础,通过实践编写如24点游戏这样的应用程序能加强编程能力。该游戏要求玩家通过加、减、乘、除运算和括号的使用,使得四个1到13之间的数字的结果等于24。在C语言中实现此游戏需要掌握基本语法、数组和指针、函数、堆栈操作、数据结构和算法、错误处理以及用户交互等关键知识点。通过这样的项目,初学者能进一步探索编程的实际应...

weixin_42402664的博客 1758

C语言

C语言 42.C语言是一种计算机高级语言。 43.C语言允许直接访问物理地址,能进行位操作。 44.C语言是结构化程序设计语言 45.c程序要通过编译,连接才能得到可执行的目标程序 46.用c语言编写程序,可以编写出任何类型的程序 47.C语言允许有空函数 48.C程序书写格式,允许一行内可以写几个语句 49.C程序的语句无行号 50.C语言的每个语句的最后必须有一个分号 51.C语言本身没有输入...

qq_45481418的博客 2万+

C语言实战项目:24点计算器开发

int c;= EOF);该函数可封装在输入处理函数中,确保每次输入前缓冲区为空。在程序设计中,判断一个表达式是否为“合法解”需要满足以下条件:表达式语法正确:括号匹配、运算符使用合法;所有数字都被使用一次;运算结果等于24(允许浮点误差在一定范围内);运算过程中不出现除以零的情况。为了处理浮点数的精度问题,通常采用一个误差范围(如1e-6)进行比较:// 合法解逻辑分析:fabs()是 C 语言标准库<math.h>

weixin_35757531的博客 939

C语言基础知识

大一时做的C语言笔记,希望对你有帮助

2301_80484013的博客 3141

深度学习十大算法之Word2Vec

Word2Vec的提出,标志着词嵌入技术的一次重大进步。Word2Vec是一种高效的词嵌入模型,由Google的研究团队于2013年开发。它使用一种称为神经网络的机器学习方法,通过学习大量文本数据,生成能够表达词语间丰富语义关系的词向量。Word2Vec的核心优势在于它能够捕捉到词语之间的细微关系。例如,在Word2Vec模型中,可以通过计算向量之间的距离来估计词语之间的相似度。这不仅能帮助理解语言的复杂性,还可以应用于各种NLP任务,如机器翻译和搜索引擎优化。

第欧根尼的酒桶的博客 1864

应用软件——Altium Designer 19 Gerber/坐标文件

如何输出Gerber文件 步骤如下: 打开需要输出的PCB文件 2. 设置原点坐标 3. 打开Gerber Files 选项,File–>Fabrication Opuputs–>Gerber Files。 4. General参数设置。 用于指定输出Gerber文件中使用的单位(Units)和格式(Format)。单位可以是公制(Millimeters)和英制(Inches);格式栏中2:3,2:4,2:5代表文件中使用的不同数据精度,其中2:3表示数据含2位整数3位小数;相应的,另外两个分

染血黑兔的博客 7202

【C语言】文件操作

1.为什么需要文件操作2.文件的打开与关闭3.文件指针4.文件的打开与关闭5.fopen6.函数声明7.文件的打开方式8.函数使用9.fclose10.函数声明11.函数使用12.文件的顺序读写13.fgetc与fputc14.函数声明15.函数使用16.fgets与fputs17.函数声明18.函数使用19.fscanf与fprintf20.函数声明21.函数使用22.fread与fwrite23.函数声明。

hhj25802580的博客 1072

如何下载era5数据?(两种方式)

供水利大数据云计算课程同学参考使用#

Camiel_sweet的博客 1万+

【性能飞跃】:基于存算芯片的C语言开发,你必须知道的6个数据对齐技巧

提升存算芯片的 C 语言性能,关键在于数据对齐优化。本文详解6个高效对齐技巧,覆盖内存访问、结构体布局等核心场景,显著提升运行效率与能效比。适用于边缘计算与AI推理,值得收藏。

codeink的博客 781

多核异构处理器核间通信:从共享内存到RPMsg协议的实战解析

在多核异构处理器架构中,核间通信是实现高效协同计算的核心技术。其基本原理是通过共享内存作为数据交换的物理媒介,配合硬件信号机制实现同步与通知。从技术价值看,它解决了不同架构核心间的数据共享与指令协同问题,是释放异构计算潜力的关键。在应用场景上,该技术广泛应用于智能物联网设备、汽车电子和工业控制等领域,用于连接高性能应用处理器与实时微控制器。本文以典型的ARM Cortex-A与Cortex-M组合为例,深入剖析了基于共享内存和RPMsg协议的通信机制,涵盖了从硬件基础到软件协议栈的完整实现链路,并提供了针对

weixin_26969269的博客 447

在银河麒麟V10上部署Atlas 300i Duo:从固件到驱动的一站式踩坑笔记

日期:2025-09-09关键词:鲲鹏920、Atlas 300i Duo、银河麒麟V10、NPU、驱动、固件。

weixin_41544125的博客 2808

YTU 2972: C语言习题5.24--文件操作1

2972: C语言习题5.24--文件操作1 时间限制: 1 Sec  内存限制: 128 MB 提交: 248  解决: 94 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编号,姓名,成绩),每个学生信息占一行,每行的数据之间使用制表符分割,如下所示: 145811  fuxin 100 145811  chengxian 90 145812  zha

小坏蛋_千千 1861

颠覆性创新的测量框架与跨领域实证分析

颠覆性创新作为科技发展的重要驱动力,其核心在于实现知识体系的范式转换。从技术原理看,这类创新通常具备知识替代、网络重构和跨领域渗透三大特征,通过引用网络分析和文本挖掘等方法可量化评估其影响力。在工程实践中,CD指数、DI指数等测量工具帮助研究者识别具有突破潜力的成果,而深度学习等新兴技术进一步提升了评估精度。当前AI、半导体等领域的热门技术发展表明,模块化架构和产业协同能有效促进颠覆性创新。面对全球范围内创新颠覆性下降的趋势,优化科研评价体系、构建跨学科协作网络成为关键应对策略。

weixin_29735807的博客 321

零基础C语言学习日志24(文件操作)

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

ZCollapsar的博客 646

风-车-桥耦合随机振动预测框架:从物理模型到高效代理

本文提出了一种风-车-桥耦合随机振动预测的混合框架,结合物理模型与代理模型实现高效计算。该框架的核心数学本质是时变参数-随机激励-高维动力系统,主要解决三大计算难点:自由度规模悬殊、时变特性和随机性传播。系统采用分层解耦-代理加速的技术路线,底层基于物理模型建立车辆运动方程和桥梁运动方程,上层通过深度学习代理实现随机激励到响应的端到端映射。文中详细介绍了随机激励建模(包括脉动风速和路面不平度)、子系统建模、耦合求解方法,并提供了可运行的Python代码实现。该框架可显著提高风-车-桥系统随机振动分析的效率,

huanghm88的专栏 102

VMware ESXi 直通GPU

虚拟机需要独享GPU资源,那么就需要用到DirectPath I/O (直通),ESXi hypervisor 把 GPU 设备直接映射成虚机中的 GPU 设备,供应用使用。注意,内存注意一定要勾选预留,否则开机后报错如下:无法打开虚拟机 win10 的电源。1.ESXi主机,管理,硬件,PCI设备,勾选GPU卡,切换直通,会提示要求重启主机,重启主机之后,该GPU设备直通一栏显示为“活动”。先确认虚拟机是否EFI引导:编辑虚拟机 - 虚拟机选项 - 引导选项 - 固件 - EFI。

liwension的博客 6293

最新C语言基础知识入门来了(更新于24年)

c语言基础知识入门一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等,2024年C语言基础知识入门大全。C语言基础知识入门也是其它众多高级语言的鼻祖语言,所以说学习C语言基础知识入门是进入编程世界的必修课!需 要 C语言基础知识入门大全 PDF版 和 详 细 教 程 的可以看一下文章结尾简单来说,一个C程序就是由若干和组成。就是一条预处理命令, 它的作用是通知C语言编译系统在对C程序进行正式编译之前需

weixin_55305220的博客 1642

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

c语言程序24转换12时间,C语言将24小时制转换为12小时制的方法

C语言将24小时制转换为12小时制的方法本文实例讲述了C语言将24小时制转换为12小时制的方法。分享给大家供大家参考。具体实现方法如下:/** 24小时制转换为12小时制*/#include int main(){int n, m;printf("Enter a 24-hour time:");scanf_s("%d:%d",&n,&m);if (n < 0){printf(...

weixin_29000991的博客 9913

WINCC7.3破解文件

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

c语言简单程序读写,24C01-24C256读写操作C语言程序

#pragma ot(6,SIZE)#i nclude #i nclude #define ERRORCOUNT 10sbit SDA=P0^0;sbit SCL=P0^1;enum eepromtype{M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};enum eepromtype EepromType;/...

weixin_39986896的博客 1363

文件处理不再难:带你轻松攻克C语言文件操作

函数名功能适用范围fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets文本行输入函数所有输入流fputs文本行输出函数所有输出流fscanf格式化输入函数所有输入流fprintf格式化输出函数所有输出流fread二进制输入文件fwrite二进制输出文件。

ABWSO的博客 1449
上一篇: 23. 【C语言】共用体与枚举类型:当数据需要“变脸”
下一篇: 25. 【C语言】二进制文件与随机读写
gugucoding
博客等级 码龄140天 7粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值