Linux标准库IO接口

标准库的IO接口:
#include <stdio.h>

FILE *fopen(const char *path, const char *mode);
返回值: 成功将返回一个指向文件对象FILE的指针.否则,将返回 NULL

fopen打开文件名为path指向的字符串的文件,将一个流与它关联
参数mode指向一个字符串,以下列序列之一开始(序列之后可以有附加的字符):
r  用于只读,流被定位于文件的开始
r+ 用于读写,流被定位于文件的开始
w  用于只写,流被定位于文件的开始
w+ 用于读写,如果文件不存在就创建它.否则将截断它,流被定位于文件的开始
a  用于追加(在文件尾写).如果文件不存在就创建它,流被定位于文件的末尾
a+ 用于追加(在文件尾写).如果文件不存在就创建它,读文件的初始位置是文件的开始,但是输出总是被追加到文件的末尾

r+的读写和w+的读写有什么区别:
r+ 打开文件用于读写, 若文件不存在则报错
w+ 打开文件用于读写, 若文件不存在则创建, 文件存在则清空原有内容

b 如果不指定b, 则认为文件是文本操作, 加上b则认为是二进制操作, 区别在于:
有时候一个特殊字符, 只是一个字符但是占据两个字节的内存(读取一个100字节大小的文件, 文本操作最终读取出来的数据, 不一定是100字节)

size_t fread(void* buffer, size_t size, size_t count, FILE* stream);
buffer: 指向缓冲区读取的数据或者是用于接收数据的内存地址
size: 数据块大小
count: 数据块个数
stream: 读取的文件流指针
--------------------------------------------------------------------
size_t fwrite(void* buffer, size_ size, size_t count, FILE* stream);
buffer: 指向缓冲区读取的数据或者是用于接收数据的内存地址
size: 数据块大小
count: 数据块个数
stream: 写入的文件流指针
注意: fread/fwrite操作的数据实际大小是数据块大小*数据块个数
返回值:返回实际操作的数据块个数 

例如: 读取一个文件 size = 10, count = 2;
如果文件大小足够则返回2;但是若文件大小不足20字节, 则会返回1, 因为第二块没有读满
fread如果读到了文件末尾会返回0, 若要读取1000个字节, 数据块个数(count)为1, 数据块大小(size)只有512字节, 虽然读了512字节也会返回0
fread/ fwrite比较推荐数据块大小为1, 数据块个数是想要操作的数据大小

int fseek(FILE *stream, long offset, int whence);
将文件的读写指针从whence位置偏移offset个字节----跳转文件读写位置

fseek()为stream指向的流设置文件位置指示符.
跳转位置(以字节为单位)是通过将偏移字节加到地点指定的位置.
如果将whence设置为SEEK_SET,SEEK_CURSEEK_END,则偏移量是相对于文件的开头,当前位置或文件末尾
----------------------------------------------------------------------------------
int fclose(FILE *stream);
关闭文件流指针,释放资源

fseek函数对于文件没有数据也可以跳转读写位置
对文件数据进行字符串操作的时候要注意文件数据中的’\0’ , 打开文件一定不要忘了关闭文件

下面写一个程序, 熟悉一下它们的用法:

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

int main()
{
    FILE* fp = NULL;
    fp = fopen("./test.txt", "w+");  //w+文件不存在则创建,存在则清空内容
    if(fp == NULL)
    {
        perror("fopen error");  //打印上一个系统调用接口的使用错误原因
        return -1;
    }

    //fseek跳转读写位置 
    //SEEK_SET --从文件起始偏移 
    //SEEK_CUR --从当前读写位置偏移 
    //SEEK_END --从文件末尾偏移
    fseek(fp, 0, SEEK_END); //将文件的读写位置偏移到末尾

    char buf[] = "Hello World!\n";
    int ret = fwrite(buf, strlen(buf), 1, fp);
    if(ret == 0)
    {
        perror("fwrite error");
        return -1;
    }

    fseek(fp, 0, SEEK_SET);

    char tmp[1024] = {0};
    ret = fread(tmp, 1, 1023, fp);  //在块大小为1的情况下不会出现读到数据依然返回0的情况
    if(ret == 0)
    {
        printf("have no data or error\n");
    }
    printf("ret:%d-[%s]\n", ret, tmp);

    fclose(fp);
    return 0;
}
运行结果:

在这里插入图片描述

在运行程序前, 我的目录下原来没有test.txt文件; 程序运行后, 可以看到当前目录下自动创建了一个test.txt文件, 并且写入内容:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值