Linux应用编程之fopen()、fclose()、fread()、fwrite()函数

1、fopen()函数
调用fopen()函数可以打开或创建一个文件。

#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
path 参数 path 指向文件路径,可以是绝对路径、也可以是相对路径。
mode 参数 mode 指定了对该文件的读写权限,是一个字符串。
返回值: 调用成功返回一个指向 FILE 类型对象的指针( FILE * ),该指针与打开或创建的文件相关联, 后续的标准 I/O 操作将围绕 FILE 指针进行。如果失败则返回 NULL ,并设置 errno 以指示错误原因。


2、fclose()函数
调用 fclose()库函数可以关闭一个由 fopen() 打开的文件。
#include <stdio.h>
int fclose(FILE *stream);
参数 stream FILE 类型指针,调用成功返回 0 ;失败将返回 EOF (也就是 -1 ),并且会设置 errno 来指示错误原因。

3、fread()
当使用 fopen() 库函数打开文件之后,我们便可以使用 fread() 库函数对文件进行读操作
 
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

ptrfread()将读取到的数据存放在参数 ptr 指向的缓冲区中;

sizefread()从文件读取 nmemb 个数据项,每一个数据项的大小为 size 个字节,所以总共读取的数据大小为 nmemb * size 个字节。

nmemb参数 nmemb 指定了读取数据项的个数。

streamFILE 指针。

返回值:调用成功时返回读取到的数据项的数目(数据项数目并不等于实际读取的字节数,除非参数 size 等于 1);如果发生错误或到达文件末尾,则 fread()返回的值将小于参数 nmemb,那么到底发生了错误 还是到达了文件末尾,fread()不能区分文件结尾和错误,究竟是哪一种情况,此时可以使用 ferror()或 feof() 函数来判断。

4、fwrite()

#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr 将参数 ptr 指向的缓冲区中的数据写入到文件中。
size 参数 size 指定了每个数据项的字节大小,与 fread() 函数的 size 参数意义相同。
nmemb 参数 nmemb 指定了写入的数据项个数,与 fread() 函数的 nmemb 参数意义相同。
stream FILE 指针。
返回值: 调用成功时返回写入的数据项的数目(数据项数目并不等于实际写入的字节数,除非参数 size 等于 1 );如果发生错误,则 fwrite() 返回的值将小于参数 nmemb (或者等于 0 )。

示例代码:标准 I/O 之 fwrite()写文件

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char buf[] = "Hello World!\n";
    FILE *fp = NULL;
    /* 打开文件 */
    if (NULL == (fp = fopen("./test_file", "w")))
    {
        perror("fopen error");
        exit(-1);
    }
    printf("文件打开成功!\n");
    /* 写入数据 */
    if (sizeof(buf) > fwrite(buf, 1, sizeof(buf), fp))
    {
        printf("fwrite error\n");
        fclose(fp);
        exit(-1);
    }
    printf("数据写入成功!\n");
    /* 关闭文件 */
    fclose(fp);
    exit(0);
}

首先使用 fopen()函数将当前目录下的 test_file 文件打开,调用 fopen()时 mode 参数设置为"w",表示以只写的方式打开文件,并将文件的长度截断为 0,如果指定文件不存在则创建该文件。打开文件之后调用fwrite()函数将"Hello World!"字符串数据写入到文件中。

编译测试:

 示例代码:标准 I/O 之 fread()读文件
 

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char buf[50] = {0};
    FILE *fp = NULL;
    int size;

    /* 打开文件 */
    if (NULL == (fp = fopen("./test_file", "r")))

    {
        perror("fopen error");
        exit(-1);
    }
    printf("文件打开成功!\n");

    /* 读取数据 */
    if (12 > (size = fread(buf, 1, 12, fp)))
    {
        if (ferror(fp))
        { //使用 ferror 判断是否是发生错误
            printf("fread error\n");
            fclose(fp);
            exit(-1);
        }
        /* 如果未发生错误则意味着已经到达了文件末尾 */
    }

    printf("成功读取%d 个字节数据: %s\n", size, buf);
    /* 关闭文件 */
    fclose(fp);
    exit(0);
}
首先同样使用 fopen() 打开当前目录下的 test_file 文件得到 FILE 指针,调用 fopen() 时其参数 mode 设置 为"r" ,表示以只读方式打开文件。 接着使用 fread() 函数从文件中读取 12 * 1=12 个字节的数据,将读取到的数据存放在 buf 中,当读取到的字节数小于指定字节数时,表示发生了错误或者已经到达了文件末尾,程序中调用了库函数 ferror() 来判断是不是发生了错误。如果未发生错误,那么就意味着已经达到了文件末尾, 其实也就说明了在调用 fread() 读文件时对应的读写位置到文件末尾之间的字节数小于指定的字节数。

编译测试:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值