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;
//}
相关推荐
草履虫建模2 分钟前
Ajax原理、用法与经典代码实例
java·前端·javascript·ajax·intellij-idea
强哥叨逼叨7 分钟前
别被假象迷惑!揭秘 Java 线程池中“线程空着但任务卡着”的真相
java
秋说10 分钟前
【PTA数据结构 | C语言版】二叉树层序序列化
c语言·数据结构·算法
_extraordinary_11 分钟前
Java 栈和队列
java·开发语言
xiaofann_21 分钟前
【数据结构】单链表练习(有环)
数据结构
codervibe25 分钟前
无微信依赖!纯网页扫码登录实现方案详解
java·后端
NuyoahC34 分钟前
笔试——Day9
数据结构·c++·笔试
地平线开发者35 分钟前
开发者说|Aux-Think:为什么测试时推理反而让机器人「误入歧途」?
算法·自动驾驶
Tiny番茄41 分钟前
46. 携带研究材料(01背包二维数组)
算法·动态规划
间彧41 分钟前
RedisTemplate介绍与使用
java·redis