C语言基础知识--文件的顺序读写与随机读写

复制代码
// fwirte 和 fread

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

// fread (void *ptr, size_t size, size_t nmemb, FILE *stream); //二进制读
// fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream); //二进制写 ,写数据块到文件流
// struct  Person {
//     char name[20];
//     int age;
//     float score;
// };
// int main  () {
//     // 打开文件
//    // struct Person p = {"张三", 18, 90.5};
//    // FILE *fp = fopen ( "test.txt" , "wb" );
//    struct Person p = {0};
//     FILE *fp = fopen ( "test.txt" , "rb" );
//     // 判断文件是否打开成功
//     if ( fp == NULL ) {
//         perror("fopen");
//         return -1;
//     }
//     // 写数据块到文件流
//     // fwrite ( &p , sizeof(struct Person) , 1 , fp );
//     // 读取成功后,返回实际读到的个数
//     fread(&p, sizeof(struct Person), 1, fp);  // 读取数据块 从文件里读1个大小为 Person 的数据块 放到 p 中
//     // 输出数据
//     printf ("%s %d %.2f\n", p.name, p.age, p.score);
//     // 关闭文件
//     fclose ( fp );
//     fp = NULL;
//     return 0;
//
// }


// 文件的随机读写
// fseek: 文件指针的偏移
// fseek ( FILE *stream , long offset , int whence );
// offset :偏移的字节数 可以正负
// whence 0:从文件开头开始偏移 1:从当前位置开始偏移 2:从文件末尾开始偏移 offset:偏移的字节数 可以正负
// ftell : 输出文件指针相较于起始位置的偏移量
// ftell(fp)
// rewind : 将文件指针重新定位到文件起始位置
// rewind(fp)

// struct Person {
//     char name[32];
//     int age;
//     float height;
// };
// int main () {
//     FILE *fp = fopen("test56.txt" , "r");
//     if ( fp == NULL ) {
//         return -1;
//     }
//     int ch = 0;
//     // SEEk_CUR:从当前位置开始偏移
//     // SEEK_END:从文件末尾开始偏移
//     // SEEK_SET:从文件开头开始偏移
////     fseek(fp , 2 , SEEK_SET);
//     fseek(fp , -2 , SEEK_END);
//     ch = fgetc(fp);
//     printf ("%c\n", ch);
//     // 输出文件指针相较于起始位置的偏移量
//     printf ("%ld\n", ftell(fp));
//     // 让文件指针回到起始位置
//     rewind(fp);
//     ch = fgetc(fp);
//     printf ("%c\n", ch);
//     // 关闭文件
//     fclose(fp);
//     fp = NULL;
//     return 0;
// }


// 文件结束的判定
// 1、 被错误使用的 feof函数 ,是用于判断文件指针是否已经到达文件末尾。
// 2、 读取文件结束的原因: 1、文件结束符 EOF ,2、遇到错误
// 3、 文本文件的结束: fgetc 函数返回 EOF ,fgets 函数返回 NULL
// 4、 二进制文件的结束: fread 函数返回 值是否小于实际要读的个数
// 5、 文件结束的判定: feof 函数(检查文件是否结束),ferror 函数: 检测文件是否结束,返回错误状态值

//enum {
//    size = 10
//};
//int main(){
//    double s[size] ={1,2,3,4,5,6,7,8,9,10}
//    FILE *fp1 = fopen("test1.txt" , "r");
//
//}

// 拷贝 test1 文件的数据到 test2 文件中
//int main(){
//    // 打开文件
//    FILE *fpread = fopen("test1.txt" , "r");
//    if ( fpread == NULL ) {
//        perror("fopen");
//        return -1;
//    }
//    FILE *fpwrite = fopen("test2.txt" , "w");
//    if ( fpwrite == NULL ) {
//        perror("fopen");
//        fclose(fpread);
//        return -1;
//    }
//    // 读写文件
//    int ch = 0;
//    while ( (ch = fgetc(fpread)) != EOF ) // 不等于eof 则代表正常
//    {
//        fputc(ch , fpwrite);
//    }
//    // 关闭文件
//    fclose (fpread);
//    fpread = NULL;
//    fclose (fpwrite);
//    fpwrite = NULL;
//    return 0;
//}

// 文件缓冲区 :所谓缓冲区,就是把数据先暂存到一个缓冲区中,然后再一次性写入文件。
// 所谓缓冲区是指系统自动地在内存中为程序每一个正在使用的文件开辟一块缓冲区,从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后,再把缓冲区中的数据写入磁盘。
// 关闭文件也会刷新缓冲区
// 如果不刷新缓冲区,数据可能会丢失。

// 编译和链接
// 翻译环境和运行环境
// 翻译环境: 编译和链接 生成可执行文件程序 .exe  文件
// 编译: 预处理 、编译、汇编、 链接
// 运行环境:  运行程序
// 源文件经过编译器 编译处理生成 .obj 目标文件 ,通过链接库工作生成链接文件 .exe
// 链接库是指运行时环境所依赖的库文件
// 多个目标文件和链接库一起经过链接生成可执行文件
// 编译器的三个执行过程:.c/.h 预处理生成.i的文件、编译 .s 文件、汇编 生成 .obj 文件 链接生成可执行文件
//extern int ADD(int a,int b);
//int main(){
//    int a = 10;
//    int b = 20;
//    int c =ADD(a,b);
//    printf("c = %d\n",c);
//    return 0;
//}
相关推荐
徐小夕8 分钟前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
不知名的老吴23 分钟前
线程的生命周期之线程“插队“
java·开发语言·python
akunkuntaimei24 分钟前
2026年高考数学各省真题及答案(完整版)
算法·高考
ANnianStriver33 分钟前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
Hello:CodeWorld1 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
杨了个杨89821 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
8Qi82 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
马士兵教育3 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
youngerwang3 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
想要成为糕糕手4 小时前
前端必修课:JavaScript 数组与数据结构底层逻辑全解析
javascript·数据结构·面试