专栏首页流媒体C语言文件读写方法

C语言文件读写方法

[TOC]

fwrite

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

  • ptr:指向保存数据的指针;
  • size:每个数据类型的大小
  • count:数据的个数
  • stream:文件指针
  • return 函数返回写入数据的个数
int write(const char *path) {
    FILE *file = fopen(path, "wb");
    if (file == NULL) {
        return 0;
    }
    int arr[4] = {0x00000012, 0x00001234, 0x00123456, 0x12345678};
    for (int i = 0; i < 4; i++) {
        fwrite(&arr[i], sizeof(int), 1, file);
    }
    fclose(file);
    return 1;
}

查看输出的文件,看到数据的存储是小端对齐

1.png

w wb的区别

wb 打开或新建一个二进制文件,在POSIX系统,包括Linux都会忽略该字符。windows文本文件打开时写入\n,会自动加上\r变成\r\n。而已二进制方式打开则不会加上\r。

int write(const char *path) {
    FILE *file = fopen(path, "wb+");
//    FILE *file = fopen(path, "w");
    if (file == NULL) {
        return 0;
    }
    char *p = "abc\n1234";
    int len = fwrite(p, sizeof(char), strlen(p), file);
    printf("write len=%d\n", len);
    fclose(file);
    return 1;
}

使用wb+时候结果为:

write len=8
-------------
abc
12341234
read  length=8

使用w打开时,结果为:

write len=8
-------------
abc
1234123
read  length=9

fread

int read(const char *path) {
    FILE *file = fopen(path, "rb");
    if (file == NULL) {
        return 0;
    }
    int len = 0;
    int total = 0;
    char buf[5] = {0};
    while (!feof(file)) {
        len = fread(buf, sizeof(char), 4, file);
        printf("%s", buf, len);
        total += len;
    }
    printf("\nread  length=%d", total);
    fclose(file);
    return 1;
}

注意:fread返回成功有效的读取的item元素的个数。

这里修改写下代码:

#include <stdio.h>
#include <mem.h>

char *PATH1 = "D:\\code\\CProject\\FileByte\\1";

int read(const char *);

int write(const char *);

int main() {
    write(PATH1);
    printf("-------------\n");
    read(PATH1);
    return 0;
}

int write(const char *path) {
//    FILE *file = fopen(path, "wb+");
    FILE *file = fopen(path, "w");
    if (file == NULL) {
        return 0;
    }
    char *p = "abc\n1234";
    int len = fwrite(p, sizeof(char), strlen(p), file);
    printf("write len=%d\n", len);
    fclose(file);
    return 1;
}

int read(const char *path) {
    FILE *file = fopen(path, "rb");
    if (file == NULL) {
        return 0;
    }
    int len = 0;
    int total = 0;
    //使用short
    short buf[20] = {0};
    while (!feof(file)) {
        len = fread(buf, sizeof(short), 20, file);
        for (int i = 0; i < len + 2; i++) {
            printf("%x-", buf[i]);
        }
        total += len;
    }
    printf("\nread  length=%d", total);
    fclose(file);
    return 1;
}

结果为:

write len=8
-------------
6261-d63-310a-3332-34-0-
read  length=4

总共9个字节,而实际有效读入了4个short。

2.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C语言文件操作 stat,fseek,copy

    作者:简书 链接:http://www.jianshu.com/p/q81RER 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注...

    用户2929716
  • Builder模式剖析示例

    当一个对象创建的过程比较简单,比如:手机,在发布时候型号功能颜色都已经确定,这是我们只需要一个手机工厂给我们创建即可。当一个对象产品比较复杂,自定义属性的比较多...

    用户2929716
  • C语言结构体对齐

    用户2929716
  • 关关的刷题日记11——Leetcode 1. Two Sum 方法2、3

    关小刷刷题11 – Leetcode 1. Two Sum 方法2、3 方法2 方法2:先将数组进行排序,设置两个左右指针,若sum>target, 那么右指针...

    WZEARW
  • Leetcode算法【34在排序数组中查找元素】

    在之前ARTS打卡中,我每次都把算法、英文文档、技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化。

    程序员小跃
  • 剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I

    输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2:

    TrueDei
  • 在线调节文件系统大小中遇到的问题

    The Solution A file system inconsistency blocked the online resize of the disk, ...

    domain0
  • C# Datalist 多列及Image中图片路径的绑定

    今天搞公司三放心员工评选的程序,最后的评选是那种带头像,下面是评选星级和点赞的那种,平常的都是数据管理,用Gridview比较多,今天学习和尝试多列的绑定可以使...

    崔文远TroyCui
  • leetcode 1-Two Sum问题

    问题: 给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但...

    CristianoC
  • LeetCode题解001:两数之和

    ​ hashmap[num] = i #这句不能放在if语句之前,解决list中有重复值或target-num=num的情况 不过方法四相较于方...

    对弈

扫码关注云+社区

领取腾讯云代金券