C/C++学习笔记-文件读写demo

概述

这是一个调用c/c++ 的标准库写的文件读写例程.

背景

因为之前写的系统中,总会用到文件的读写,但常因为记忆力下降导致忘记了文件的读写操作,所以决定写一个demo来方便记忆.

功能实现

这个是C文件

#include "fileRW.h"
#include <stdio.h>

//-------------------------------------------------------------------------------------------------------------------------------
//      fopen打开文件的方式
//
//r     以只读方式打开文件,该文件必须存在。
//r+    以读/写方式打开文件,该文件必须存在。
//rb+   以读/写方式打开一个二进制文件,只允许读/写数据。
//rt+   以读/写方式打开一个文本文件,允许读和写。
//w     打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
//w+    打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
//a     以附加的方式打开只写文件。若文件不存在,则会创建该文件;如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保留)。
//a+    以附加方式打开可读/写的文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF符不保留)。
//wb    以只写方式打开或新建一个二进制文件,只允许写数据。
//wb+   以读/写方式打开或新建一个二进制文件,允许读和写。
//wt+   以读/写方式打开或新建一个文本文件,允许读和写。
//at+   以读/写方式打开一个文本文件,允许读或在文本末追加数据。
//ab+   以读/写方式打开一个二进制文件,允许读或在文件末追加数据。
//-------------------------------------------------------------------------------------------------------------------------------

//函数名:c_write_file
//功能:把内容写入文件
//参数:filename:文件名,ptr:写入的数据,size:写入的个数
//返回值:成功写入的个数
int c_write_file(const char *filename, void *ptr, unsigned int size)
{   
    FILE *fp;
    size_t num;

    fp = fopen(filename,"ab+");

    if(fp == NULL)
    {
        printf("\r\n open %s file fail!\r\n", filename);
        return -1;   
    }
    
    num = fwrite(ptr,1,size,fp);

    if(num != size)
    {
        fclose(fp);
        printf("\r\n write %s file error!\r\n", filename);
        
        return -1;
    } 

    fclose(fp);

    return num;
}

//函数名:c_read_file
//功能:从文件开头把文件的内容读出
//参数:filename:文件名,ptr:读出数据存储的地方,size:读出的个数
//返回值:成功读出的个数
int c_read_file(const char *filename, void *ptr, unsigned int size)
{
    FILE *fp;
    size_t num;
    fp = fopen(filename,"rb");

    if(fp == NULL)
    {
        printf("open %s file fail!\r\n", filename);
        return -1;
    }
    
    num = fread(ptr,1,size,fp);

    if(num != size)
    {
        fclose(fp);
        printf("read %s file error!\r\n", filename);
        
        return -1;
    } 
    fclose(fp);

    return num;
}

//函数名:c_read_offset_file
//功能:从文件开头偏移的位置把文件的内容读出
//参数:filename:文件名,ptr:读出数据存储的地方,size:读出的个数,offset:从文件开头偏移的值
//返回值:成功读出的个数
int c_read_offset_file(const char *filename, void *ptr, unsigned int size,long offset)
{
    FILE *fp;
    size_t num;
    fp = fopen(filename,"rb");

    fseek(fp,offset,SEEK_SET);//SEEK_SET:文件开头,SEEK_END:文件结尾,SEEK_CUR:文件当前位置
    if(fp == NULL)
    {
        printf("open %s file fail!\r\n", filename);
        return -1;
    }
    
    num = fread(ptr,1,size,fp);

    if(num != size)
    {
        fclose(fp);
        printf("read %s file error!\r\n", filename);
        
        return -1;
    } 
    fclose(fp);

    return num;
}

这个是H文件

#ifndef __FILE_R_W_H__
#define __FILE_R_W_H__


int c_read_file(const char *filename, void *ptr, unsigned int size);
int c_write_file(const char *filename, void *ptr, unsigned int size);
int c_read_offset_file(const char *filename, void *ptr, unsigned int size,long offset);

#endif

使用例程

为了验证功能,创建了一个目录,目录包含:file.bin ,fileRW.c, fileRW.h ,main.c ,makefile这些文件.

linux@linux:~/mytestcode/fileRW$ ls
file.bin  fileRW.c  fileRW.h  main.c  makefile

写了一个功能函数(mian.c)

#include <stdio.h>
#include <string.h>
#include "fileRW.h"

#define FILENAME "./file.bin"   //文件名


int main(int argc, char **argv)
{
    int num = 0;
    char data[9] = {"123456789"};
    char ptr[20] = {0};

    memset(ptr,0,sizeof(ptr));
    printf("ptr  data : %s\n",ptr);

    num = c_write_file(FILENAME,data,sizeof(data));
    printf("file write file len : %d\n",num);

    num = c_read_file(FILENAME,ptr,3);
    printf("file read file len : %d\n",num);
    printf("file read data : %s\n",ptr);

    memset(ptr,0,sizeof(ptr));
    printf("ptr  data : %s\n",ptr);

    num = c_read_file(FILENAME,ptr,15);
    printf("file read file len : %d\n",num);
    printf("file read data : %s\n",ptr);

    memset(ptr,0,sizeof(ptr));
    printf("ptr  data : %s\n",ptr);

    num = c_read_offset_file(FILENAME,ptr,3,3);
    printf("file read file len : %d\n",num);
    printf("file read data : %s\n",ptr);

    return 0;
}

然后在同目录路径下新建了一个./file.bin的文件用来测试;
然后还写了一个makefile 的编译文件,如下:

main:main.o fileRW.o
	gcc -o main main.o fileRW.o

main.o:main.c
	gcc -g -c main.c

fileRW.o:fileRW.c
	gcc -g -c fileRW.c


clean:
	rm -f main.o main fileRW.o

在同目录下,调出linux 的终端,输入"make"完成编译,然后输入"./main"执行编译出来的可执行文件,得到如下内容,确认功能可行.

ptr  data : 
file write file len : 9
file read file len : 3
file read data : 123
ptr  data : 
file read file len : 15
file read data : 123456789123456
ptr  data : 
file read file len : 3
file read data : 456

总结

功能可以实现,下次使用时可以之间复制 fileRW.c, fileRW.h 这两个文件到工程中使用.

免责声明:本文内容含网络参考、作者编写等,内容版权归原作者所有,未经允许,禁止转载。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值