C语言文件操作相关函数详解:fread、fwrite、fseek、ftell、fclose

在C语言中,文件操作是程序开发中非常重要的一部分。无论是读取文件内容、写入数据,还是对文件进行随机访问,C标准库都提供了丰富的函数来支持这些操作。本文将详细介绍常用的文件操作函数,包括freadfwritefseekftellfclose,并通过实例介绍这些函数的使用方法。


目录

1. fread 函数

2. fwrite 函数

3. fseek 函数

4. ftell 函数

5. fclose 函数

6. 综合示例:文件的读取、写入和随机访问

7. 总结


1. fread 函数

fread函数用于从文件中读取数据,通常用于二进制文件的读取操作。它的函数原型如下:

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

参数说明:

  • ptr:指向一个内存块的指针,用于存储从文件中读取的数据。

  • size:每个数据项的大小(以字节为单位)。

  • nmemb:要读取的数据项的数量。

  • stream:指向FILE对象的指针,指定一个输入流。

返回值:

  • 返回成功读取的数据项数量。如果返回值小于nmemb,可能是因为遇到了文件末尾或发生了读取错误。

示例:读取二进制文件中的数据

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

int main() {
    FILE *file;
    int *buffer;
    size_t num_elements = 5;
    size_t elements_read;

    // 打开二进制文件
    file = fopen("data.bin", "rb");
    if (file == NULL) {
        perror("无法打开文件");
        return EXIT_FAILURE;
    }

    // 分配内存来存储读取的数据
    buffer = (int *)malloc(num_elements * sizeof(int));
    if (buffer == NULL) {
        perror("内存分配失败");
        fclose(file);
        return EXIT_FAILURE;
    }

    // 使用fread读取数据
    elements_read = fread(buffer, sizeof(int), num_elements, file);
    if (elements_read < num_elements) {
        if (feof(file)) {
            printf("已到达文件末尾,读取的元素数量少于预期。\n");
        } else if (ferror(file)) {
            perror("读取文件时发生错误");
        }
    }

    // 打印读取的数据
    for (size_t i = 0; i < elements_read; i++) {
        printf("%d ", buffer[i]);
    }
    printf("\n");

    // 释放内存并关闭文件
    free(buffer);
    fclose(file);

    return EXIT_SUCCESS;
}


2. fwrite 函数

fwrite函数用于将数据写入文件,通常用于二进制文件的写入操作。它的函数原型如下:

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

参数说明:

  • ptr:指向要写入文件的数据的指针。

  • size:每个数据项的大小(以字节为单位)。

  • nmemb:要写入的数据项的数量。

  • stream:指向FILE对象的指针,指定一个输出流。

返回值:

  • 返回成功写入的数据项数量。如果返回值小于nmemb,说明写入过程中发生了错误。

示例:将数据写入二进制文件

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

int main() {
    FILE *file;
    int data[] = {10, 20, 30, 40, 50};
    size_t num_elements = sizeof(data) / sizeof(data[0]);

    // 打开二进制文件
    file = fopen("output.bin", "wb");
    if (file == NULL) {
        perror("无法打开文件");
        return EXIT_FAILURE;
    }

    // 使用fwrite写入数据
    size_t elements_written = fwrite(data, sizeof(int), num_elements, file);
    if (elements_written < num_elements) {
        perror("写入文件时发生错误");
    }

    // 关闭文件
    fclose(file);

    printf("数据已成功写入文件。\n");
    return EXIT_SUCCESS;
}


3. fseek 函数

fseek函数用于设置文件指针的位置,以便在文件中进行随机访问。它的函数原型如下:

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

参数说明:

  • stream:指向FILE对象的指针。

  • offset:偏移量(以字节为单位),表示从whence位置开始的偏移。

  • whence:起始位置,可以是以下值之一:

    • SEEK_SET:文件开头。

    • SEEK_CUR:当前文件指针位置。

    • SEEK_END:文件末尾。

返回值:

  • 如果成功,返回0;如果失败,返回非零值。

示例:随机访问文件

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

int main() {
    FILE *file;
    int value;

    // 打开二进制文件
    file = fopen("output.bin", "rb");
    if (file == NULL) {
        perror("无法打开文件");
        return EXIT_FAILURE;
    }

    // 将文件指针移动到第3个整数的位置
    fseek(file, 2 * sizeof(int), SEEK_SET);

    // 读取数据
    fread(&value, sizeof(int), 1, file);
    printf("第3个整数的值是:%d\n", value);

    // 关闭文件
    fclose(file);

    return EXIT_SUCCESS;
}


4. ftell 函数

ftell函数用于获取当前文件指针的位置(以字节为单位)。它的函数原型如下:

long ftell(FILE *stream);

参数说明:

  • stream:指向FILE对象的指针。

返回值:

  • 返回当前文件指针的位置。如果发生错误,返回-1L。

示例:获取文件指针位置

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

int main() {
    FILE *file;
    long position;

    // 打开二进制文件
    file = fopen("output.bin", "rb");
    if (file == NULL) {
        perror("无法打开文件");
        return EXIT_FAILURE;
    }

    // 移动文件指针到文件末尾
    fseek(file, 0, SEEK_END);

    // 获取文件指针位置(文件大小)
    position = ftell(file);
    printf("文件大小:%ld 字节\n", position);

    // 关闭文件
    fclose(file);

    return EXIT_SUCCESS;
}


5. fclose 函数

fclose函数用于关闭一个打开的文件,释放与该文件关联的资源。它的函数原型如下:

int fclose(FILE *stream);

参数说明:

  • stream:指向FILE对象的指针。

返回值:

  • 如果成功关闭文件,返回0;如果失败,返回EOF。

示例:关闭文件

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

int main() {
    FILE *file;

    // 打开文件
    file = fopen("output.bin", "rb");
    if (file == NULL) {
        perror("无法打开文件");
        return EXIT_FAILURE;
    }

    // 操作文件...

    // 关闭文件
    if (fclose(file) == 0) {
        printf("文件已成功关闭。\n");
    } else {
        perror("关闭文件时发生错误");
    }

    return EXIT_SUCCESS;
}


6. 综合示例:文件的读取、写入和随机访问

以下是一个综合示例,演示如何使用fwritefreadfseekftell函数对文件进行操作。

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

int main() {
    FILE *file;
    int data[] = {10, 20, 30, 40, 50};
    int buffer[5];
    size_t num_elements = sizeof(data) / sizeof(data[0]);

    // 写入数据到文件
    file = fopen("data.bin", "wb");
    if (file == NULL) {
        perror("无法打开文件");
        return EXIT_FAILURE;
    }
    fwrite(data, sizeof(int), num_elements, file);
    fclose(file);

    // 读取文件中的数据
    file = fopen("data.bin", "rb");
    if (file == NULL) {
        perror("无法打开文件");
        return EXIT_FAILURE;
    }
    fread(buffer, sizeof(int), num_elements, file);
    for (size_t i = 0; i < num_elements; i++) {
        printf("%d ", buffer[i]);
    }
    printf("\n");

    // 使用fseek和ftell获取文件大小
    fseek(file, 0, SEEK_END);
    long file_size = ftell(file);
    printf("文件大小:%ld 字节\n", file_size);

    // 关闭文件
    fclose(file);

    return EXIT_SUCCESS;
}


7. 总结

  • fread:用于从文件中读取数据,适合二进制文件操作。

  • fwrite:用于将数据写入文件,适合二进制文件操作。

  • fseek:用于移动文件指针,支持随机访问。

  • ftell:用于获取当前文件指针的位置。

  • fclose:用于关闭文件,释放资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值