嵌入式第四课-C文件操作

Posted Soaring2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式第四课-C文件操作相关的知识,希望对你有一定的参考价值。

1.c语言文件操作函数

fopen/fclose/fread/fwrite/fseek

1).fopen: FILE *fopen(const char *filename,const char *mode);

函数功能 :打开一个文件

参数 filename :文件路径

参数mode      :打开方式

返回值  :打开成功返回一个标准数据指针  失败返回NULL

mode参数如下:  

r

以只读方式打开文件,该文件必须存在。

r+

以读/写方式打开文件,该文件必须存在。

rb+

以读/写方式打开一个二进制文件,只允许读/写数据。

rt+

以读/写方式打开一个文本文件,允许读和写。

w

打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。

w+

打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。

a

以附加的方式打开只写文件。若文件不存在,则会创建该文件;如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保留)。

a+

以附加方式打开可读/写的文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF符不保留)。

wb

以只写方式打开或新建一个二进制文件,只允许写数据。

wb+

以读/写方式打开或新建一个二进制文件,允许读和写。

wt+

以读/写方式打开或新建一个文本文件,允许读和写。

at+

以读/写方式打开一个文本文件,允许读或在文本末追加数据。

ab+

以读/写方式打开一个二进制文件,允许读或在文件末追加数据。

 

示例:

#include <stdio.h>
int main(void)
{
        int a[] = {1,2,3,4,5,6,7};
        int len =sizeof(a)/sizeof(a[0]);

        FILE  *fp = NULL;
        fp = fopen("/myproject/txt.txt","r+");
        if(fp==NULL)
        {
                printf("failed  open file!\\r\\n");
                return -1;
        }
        else
        {
                printf("success open file!\\r\\n ");
        }
        fclose(fp);
        return 0;
}


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

返回值:返回实际写入的数据块数目

(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;

(2)size:要写入内容的单字节数;

(3)count:要进行写入size字节的数据项的个数;

(4)stream:目标文件指针

(5)返回实际写入的数据项个数count。

 

 

size_t freadvoid *restrict buffer, size_t size, size_t count, FILE *restrict stream );//C99起

从给定输入流stream读取最多count个对象到数组buffer中(相当于以对每个对象调用size次fgetc),把buffer当作unsigned char数组并顺序保存结果。流的文件位置指示器前进读取的字节数。

若出现错误,则流的文件位置指示器的位置不确定。若没有完整地读入最后一个元素,则其值不确定。

参数

buffer

指向要读取的数组中首个对象的指针

size

每个对象的大小(单位是字节)

count

要读取的对象个数

stream

输入流

返回值

返回成功读取的对象个数,若出现错误或到达文件末尾,则可能小于count。

若size或count为零,则fread返回零且不进行其他动作。

fread不区分文件尾和错误,因此调用者必须用feofferror才能判断发生了什么。

 

函数名: rewind()

功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头

注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。

rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET); [1] 

用 法: void rewind(FILE *stream);

头文件: stdio.h

返回值:无

 

int fseek( FILE *stream, long offset, int origin );

第一个参数stream为文件指针

第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移

第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

SEEK_SET: 文件开头

SEEK_CUR: 当前位置

SEEK_END: 文件结尾

其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.

简言之:

fseek(fp,100L,0);把stream指针移动到离文件开头100字节处;

fseek(fp,100L,1);把stream指针移动到离文件当前位置100字节处;

fseek(fp,-100L,2);把stream指针退回到离文件结尾100字节处。

示例:

#include <stdio.h>
int main(void)
{
        int a[] = {1,2,3,4,5,6,7};
        int len =sizeof(a)/sizeof(a[0]);

        FILE  *fp = NULL;
        fp = fopen("/myproject/txt.txt","r+");
        if(fp==NULL)
        {
                printf("failed  open file!\\r\\n");
                return -1;
        }
        else
        {
                printf("success open file!\\r\\n ");
        }

        int size = 0;
        size = fwrite(a,sizeof(int),len,fp);
        printf("write data num is %d\\r\\n ",size);

        int readdata[100]={0};

        rewind(fp);

        size = fread(readdata,sizeof(int),len,fp);
        for(int i=0;i<size;i++)
        {
                printf("%d ",readdata[i]);

       }
        printf("\\r\\n");

        fseek(fp,8,SEEK_SET);
        size = fread(readdata+20,sizeof(int),5,fp);
        for(int i=0;i<size;i++)
        {
                printf("%d ",*(readdata+20+i));
        }
        printf("\\r\\n");

        fclose(fp);
        return 0;
}

执行结果:

嵌入式第三课-第一个helloworld程序 https://blog.csdn.net/qq_21919455/article/details/117189303

嵌入式第五课-c语言结构体  :https://blog.csdn.net/qq_21919455/article/details/117262588

 

以上是关于嵌入式第四课-C文件操作的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式第四课-C文件操作

第四课 文件系统(下)

第四课

linux第四课

SQLite第四课 创建windows动态库

跟我一起学opencv 第四课之图像的基本操作