• lv4 嵌入式开发-4 标准IO的读写(二进制方式)


    目录

    1 标准I/O – 按对象读写

    2 标准I/O – 小结

    3 标准I/O – 思考和练习


    文本文件和二进制的区别:

    存储的格式不同:文本文件只能存储文本。除了文本都是二进制文件

    补充计算机内码概念:文本符号在计算机内部的编码(计算机内部只能存储数字0101001....,所以所有符号都要编码)

    1 标准I/O – 按对象读写

    下列函数用来从流中读写若干个对象:

    1. #include <stdio.h>
    2. size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
    3. //void *ptr 读取内容放的位置指针
    4. //size_t size 读取的块大小
    5. //size_t n 读取的个数
    6. //FILE *fp 读取的文件指针
    7. size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
    8. //void *ptr 写文件的内容的位置指针
    9. //size_t size 写的块大小
    10. //size_t n 写的个数
    11. //FILE *fp 要写的文件指针
    • 成功返回读写的对象个数;出错时返回EOF
    • 既可以读写文本文件,也可以读写数据文件
    • 效率高

    标准I/O – fread/fwrite – 示例

    1. int s[10];
    2. if (fread(s, sizeof(int), 10, fp) < 0) {
    3. perror(“fread”);
    4. return -1;
    5. }
    6. struct student {
    7. int no;
    8. char name[8];
    9. float score;
    10. } s[] = {{ 1, “zhang”, 97}, {2, “wang”, 95}};
    11. fwrite(s, sizeof(struct student), 2, fp);

    fread示例 

    1. #include
    2. #include
    3. int main(int argc,char *argv[]){
    4. FILE *fp;
    5. char *buff;
    6. size_t ret;
    7. fp=fopen("1.txt","r");
    8. if(fp==NULL){
    9. perror("fopen");
    10. return 0;
    11. }
    12. buff=(char*)malloc(100);
    13. if(buff==NULL){
    14. return 0;
    15. }
    16. ret = fread(buff,10,1,fp);
    17. if(ret==-1){
    18. perror("fread");
    19. goto end;
    20. }
    21. printf("buf=%s\n",buff);
    22. end:
    23. free(buff);
    24. fclose(fp);
    25. }
    26. //运行结果
    27. buf=hello worl

     fwrite和fread读写二进制示例

    1. #include
    2. #include
    3. #include
    4. struct student{
    5. char name[16];
    6. int age;
    7. char sex[8];
    8. };
    9. int main(int argc,char *argv[]){
    10. FILE *fp;
    11. size_t ret;
    12. struct student stu;
    13. struct student stu2;
    14. fp=fopen("1.bin","w");
    15. if(fp==NULL){
    16. perror("fopen");
    17. return 0;
    18. }
    19. strcpy(stu.name,"zhangsan");
    20. stu.age = 49;
    21. strcpy(stu.sex,"male");
    22. ret = fwrite(&stu,sizeof(stu),1,fp);
    23. if(ret ==-1){
    24. perror("fwrite");
    25. goto end;
    26. }else{
    27. printf("write struct student success!\n");
    28. }
    29. fclose(fp); //fp不关闭指针在最后,读取会乱,一定要重新打开。
    30. fp=fopen("1.bin","r");
    31. if(fp==NULL){
    32. perror("fopen");
    33. return 0;
    34. }
    35. ret = fread(&stu2,sizeof(stu),1,fp);
    36. if(ret ==-1){
    37. perror("fread");
    38. goto end;
    39. }
    40. printf("name=%s,age=%d,sex=%s\n",stu2.name,stu2.age,stu2.sex);
    41. end:
    42. fclose(fp);
    43. }

    vim只能查看文本文件,查看二进制文件会显示乱码

     

    注意事项:

    文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。

    解决办法:移动指针(后面讲解)到文件头;关闭文件,重新打开

    1. #include
    2. #include
    3. #include
    4. struct student{
    5. char name[16];
    6. int age;
    7. char sex[8];
    8. };
    9. int main(int argc,char *argv[]){
    10. FILE *fp;
    11. size_t ret;
    12. struct student stu2;
    13. fp=fopen("1.bin","r");
    14. if(fp==NULL){
    15. perror("fopen");
    16. return 0;
    17. }
    18. ret = fread(&stu2,sizeof(stu2),1,fp);
    19. if(ret ==-1){
    20. perror("fread");
    21. goto end;
    22. }
    23. printf("name=%s,age=%d,sex=%s\n",stu2.name,stu2.age,stu2.sex);
    24. end:
    25. fclose(fp);
    26. }

    2 标准I/O – 小结

    fgetc / fputc        

    fgets / fputs        

    fread / fwrite

    3 标准I/O – 思考和练习

    如何利用fread / fwrite实现文件的复制?

    通过命令行参数传递源文件和目标文件名

    通过fread返回值判断是否读到文件末尾

    1. #include
    2. #define BUFFER_SIZE 4096
    3. int main() {
    4. FILE *sourceFile, *targetFile;
    5. char buffer[BUFFER_SIZE];
    6. size_t bytesRead;
    7. // 打开源文件
    8. sourceFile = fopen("source.txt", "rb");
    9. if (sourceFile == NULL) {
    10. printf("无法打开源文件。\n");
    11. return 1;
    12. }
    13. // 打开目标文件
    14. targetFile = fopen("target.txt", "wb");
    15. if (targetFile == NULL) {
    16. printf("无法创建目标文件。\n");
    17. fclose(sourceFile);
    18. return 1;
    19. }
    20. // 复制文件内容
    21. while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, sourceFile)) > 0) {
    22. fwrite(buffer, 1, bytesRead, targetFile);
    23. }
    24. // 关闭文件
    25. fclose(sourceFile);
    26. fclose(targetFile);
    27. printf("文件复制完成。\n");
    28. return 0;
    29. }

     

    使用标准IO写2个学生的结构体数据到文件

    1. #include
    2. #include
    3. typedef struct _student
    4. {
    5. char name[16];
    6. int age;
    7. char sex[8];
    8. }student;
    9. int main() {
    10. FILE *fp;
    11. student stu[2];
    12. student temp[2];
    13. size_t ret;
    14. strcpy(stu[0].name,"zhangsan");
    15. stu[0].age = 10;
    16. strcpy(stu[0].sex,"male");
    17. strcpy(stu[1].name,"lisi");
    18. stu[1].age = 11;
    19. strcpy(stu[1].sex,"female");
    20. fp = fopen("1.bin","w");
    21. if (fp == NULL) {
    22. perror("fopen");
    23. return 1;
    24. }
    25. ret = fwrite(stu,sizeof(student),2,fp);
    26. if(ret == -1)
    27. {
    28. perror("fwrite");
    29. goto end;
    30. }
    31. else
    32. {
    33. printf("Write success\n");
    34. }
    35. fclose(fp);
    36. fp = fopen("1.bin","r");
    37. if (fp == NULL) {
    38. perror("fopen");
    39. return 1;
    40. }
    41. ret = fread(temp, sizeof(student), 2, fp);
    42. if(ret == -1)
    43. {
    44. perror("fread");
    45. goto end;
    46. }
    47. printf("name=%s,age=%d,sex=%s\n",temp[0].name, temp[0].age, temp[0].sex);
    48. printf("name=%s,age=%d,sex=%s\n",temp[1].name, temp[1].age, temp[1].sex);
    49. end:
    50. fclose(fp);
    51. return 0;
    52. }

  • 相关阅读:
    前端知识案例105-javascript基础语法-捕获多个异常
    大数据背景下的信息资源管理
    得物 ZooKeeper SLA 也可以 99.99%
    让工程师拥有一台“超级”计算机——字节跳动客户端编译加速方案
    华为云实验 -- 对云硬盘数据盘进行备份
    c++异步框架workflow分析
    数据结构— —队列(顺序表实现)
    【793. 阶乘函数后 K 个零】
    喜相逢再递表港交所:非控股股东均亏损,已提前“套现”数千万元
    数据分析实战 | 关联规则分析——购物车分析
  • 原文地址:https://blog.csdn.net/m0_60718520/article/details/132794105