【C语言】文件操作函数详解

简介: C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。

C语言文件操作函数详解

C语言提供了一组标准库函数来处理文件操作,这些函数定义在 <stdio.h> 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。

表格汇总

函数 作用 示例 输出
fopen 打开文件 fopen("file.txt", "r") 文件指针
fclose 关闭文件 fclose(file) 返回 0EOF
fread 从文件中读取数据 fread(buffer, size, count, file) 读取的数据
fwrite 将数据写入文件 fwrite(buffer, size, count, file) 写入的数据
fseek 设置文件位置指针 fseek(file, offset, origin) 返回 0EOF
ftell 获取文件位置指针 ftell(file) 文件位置
rewind 重置文件位置指针到文件开头 rewind(file) 无返回值
fprintf 格式化输出到文件 fprintf(file, "data: %d", value) 格式化的字符串
fscanf 从文件中格式化输入 fscanf(file, "%d", &value) 读取的值
feof 检查文件是否到达文件末尾 feof(file) 返回非零值或 0
ferror 检查文件操作是否发生错误 ferror(file) 错误代码
clearerr 清除文件流的错误和EOF标志 clearerr(file) 无返回值

1. fopen

函数原型:

FILE *fopen(const char *filename, const char *mode);

参数说明:

  • filename: 要打开的文件的路径。
  • mode: 文件打开模式,如 "r"(只读)、"w"(只写)、"a"(追加)等。

返回值说明:

  • 成功时,返回指向 FILE 类型的文件指针;失败时,返回 NULL

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;

    file = fopen("example.txt", "w");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fprintf(file, "Hello, World!\n");
    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fopen 打开文件 fopen("example.txt", "w") 文件指针或 NULL

2. fclose

函数原型:

int fclose(FILE *stream);

参数说明:

  • stream: 要关闭的文件指针。

返回值说明:

  • 成功时,返回 0;失败时,返回 EOF

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;

    file = fopen("example.txt", "w");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fprintf(file, "Hello, World!\n");
    if (fclose(file) != 0) {
   
        perror("无法关闭文件");
        return 1;
    }

    return 0;
}

表格说明:

函数 作用 示例 输出
fclose 关闭文件 fclose(file) 0EOF

3. fread

函数原型:

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

参数说明:

  • ptr: 指向存储读取数据的内存块的指针。
  • size: 每个元素的字节数。
  • count: 要读取的元素数量。
  • stream: 文件指针。

返回值说明:

  • 返回成功读取的元素数量。如果返回值小于 count,可能发生了文件结束或读取错误。

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    char buffer[20];
    size_t bytesRead;

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    bytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, file);
    buffer[bytesRead] = '\0'; // 确保字符串结束符
    printf("读取数据: %s\n", buffer);

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fread 从文件中读取数据 fread(buffer, size, count, file) 读取的数据

4. fwrite

函数原型:

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

参数说明:

  • ptr: 指向要写入文件的内存块的指针。
  • size: 每个元素的字节数。
  • count: 要写入的元素数量。
  • stream: 文件指针。

返回值说明:

  • 返回成功写入的元素数量。如果返回值小于 count,可能发生了写入错误。

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    const char *text = "Hello, File Writing!";

    file = fopen("example.txt", "w");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    if (fwrite(text, sizeof(char), strlen(text), file) < strlen(text)) {
   
        perror("写入文件失败");
        fclose(file);
        return 1;
    }

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fwrite 将数据写入文件 fwrite(buffer, size, count, file) 写入的数据

5. fseek

函数原型:

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

参数说明:

  • stream: 文件指针。
  • offset: 从 whence 指定的位置偏移的字节数。
  • whence: 指定偏移的起始位置,可以是 SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件末尾)。

返回值说明:

  • 成功时返回 0;失败时返回 -1

示例代码:

#include <stdio.h>

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

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fseek(file, 5, SEEK_SET);  // 从文件开头偏移5个字节
    position = ftell(file);    // 获取当前文件位置
    printf("文件位置: %ld\n", position); // 输出: 文件位置: 5

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fseek 设置文件位置指针 fseek(file, offset, whence) 成功时 0-1

6. ftell

函数原型:

long ftell(FILE *stream);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。

返回值说明:

  • 返回从文件开头到当前位置的字节数。成功时返回当前文件位置的偏移量,失败时返回 -1L

示例代码:

#include <stdio.h>

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

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fseek(file, 10, SEEK_SET); // 从文件开头偏移10个字节
    position = ftell(file);    // 获取当前文件位置
    printf("文件当前位置: %ld\n", position); // 输出: 文件当前位置: 10

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
ftell 获取文件当前位置 ftell(file) 文件当前位置: 10

7. rewind

函数原型:

void rewind(FILE *stream);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。

返回值说明:

  • 无返回值。此函数将文件位置指针重置到文件的开头。

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    char buffer[50];

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fread(buffer, sizeof(char), sizeof(buffer) - 1, file); // 读取文件数据
    buffer[sizeof(buffer) - 1] = '\0'; // 确保字符串结束符

    rewind(file); // 重置文件指针到开头
    fread(buffer, sizeof(char), sizeof(buffer) - 1, file); // 重新读取文件数据
    buffer[sizeof(buffer) - 1] = '\0'; // 确保字符串结束符

    printf("重新读取的数据: %s\n", buffer); // 输出重新读取的数据

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
rewind 重置文件指针到文件开头 rewind(file) 无输出(重置指针)

8. fprintf

函数原型:

int fprintf(FILE *stream, const char *format, ...);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。
  • format: 格式字符串,用于指定输出格式。
  • ...: 其他格式化数据,根据 format 中的占位符提供。

返回值说明:

  • 成功时,返回输出的字符总数;失败时返回 EOF

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    int number = 42;

    file = fopen("example.txt", "w");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    if (fprintf(file, "The answer is %d\n", number) < 0) {
   
        perror("写入文件失败");
        fclose(file);
        return 1;
    }

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fprintf 格式化输出到文件 fprintf(file, "data: %d", value) 格式化的字符串

9. fscanf

函数原型:

int fscanf(FILE *stream, const char *format, ...);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。
  • format: 格式字符串,用于指定输入格式。
  • ...: 其他格式化输入,根据 format 中的占位符提供。

返回值说明:

  • 成功时,返回成功匹配和赋值的项目数;失败时返回 EOF

示例代码:

#include <stdio.h>

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

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    if (fscanf(file, "The answer is %d", &number) != 1) {
   
        perror("读取文件失败");
        fclose(file);
        return 1;
    }

    printf("读取的数字: %d\n", number);

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fscanf 从文件中格式化输入 fscanf(file, "%d", &value) 读取的值

10. feof

函数原型:

int feof(FILE *stream);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。

返回值说明:

  • 如果到达文件末尾,返回非零值;否则返回 0

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    char buffer[20];

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    while (fread(buffer, sizeof(char), sizeof(buffer) - 1, file) > 0) {
   
        buffer[sizeof(buffer) - 1] = '\0';
        printf("读取的数据: %s\n", buffer);
    }

    if (feof(file)) {
   
        printf("到达文件末尾\n");
    } else {
   
        printf("文件读取错误\n");
    }

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
feof 检查文件是否到达文件末尾 feof(file) 到达文件末尾

11. ferror

函数原型:

int ferror(FILE *stream);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。

返回值说明:

  • 返回非零值表示发生了错误;返回 0 表示没有错误。

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    char buffer[20];

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    if (fread(buffer, sizeof(char), sizeof(buffer) - 1, file) < 0) {
   
        if (ferror(file)) {
   
            perror("读取文件错误");
        }
        fclose(file);
        return 1;
    }

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
ferror 检查文件操作是否发生错误 ferror(file) 错误代码

12. clearerr

函数原型:

void clearerr(FILE *stream);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。

返回值说明:

  • 无返回值。此函数清除流的错误标志和EOF标志。

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    char buffer[10];

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fread(buffer, sizeof(char), sizeof(buffer) - 1, file); // 模拟读取
    if (ferror(file)) {
   
        printf("读取文件时发生错误\n");
        clearerr(file); // 清除错误标志
    }

    // 继续操作文件

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
clearerr 清除文件流的错误和EOF标志 clearerr(file) 无输出(清除标志)

13. 总结

C语言的文件操作函数提供了一系列用于处理文件的工具,包括打开、关闭、读写、定位文件指针以及检查文件状态等。这些函数为程序员提供了灵活的文件管理能力,从简单的文件读写到复杂的文件处理任务,都可以通过这些标准库函数来实现。掌握这些函数的使用对于编写健壮且可靠的C程序至关重要。

14. 附录:函数参考表

函数 作用 示例 返回值
fopen 打开文件 fopen("file.txt", "r") 文件指针或 NULL
fclose 关闭文件 fclose(file) 0EOF
fread 从文件中读取数据 fread(buffer, size, count, file) 读取的数据
fwrite 将数据写入文件 fwrite(buffer, size, count, file) 写入的数据
fseek 设置文件位置指针 fseek(file, offset, SEEK_SET) 0EOF
ftell 获取文件当前位置 ftell(file) 文件位置
rewind 重置文件位置指针到文件开头 rewind(file) 无返回值
fprintf 格式化输出到文件 fprintf(file, "data: %d", value) 格式化的字符串
fscanf 从文件中格式化输入 fscanf(file, "%d", &value) 读取的值
feof 检查文件是否到达文件末尾 feof(file) 非零值或 0
ferror 检查文件操作是否发生错误 ferror(file) 错误代码
clearerr 清除文件流的错误和EOF标志 clearerr(file) 无返回值

通过理解和运用这些文件操作函数,可以有效地进行文件读写操作,并处理各种文件相关的错误和状态检查。这对于实现文件管理功能以及确保程序的健壮性具有重要意义。

15. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对C语言文件操作函数有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持
目录
相关文章
|
12天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
51 23
|
12天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
43 15
|
12天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
52 24
|
8天前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
46 16
|
7天前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
19 3
|
7天前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
11 2
|
12天前
|
存储 小程序 C语言
【C语言程序设计——文件】文件操作(头歌实践教学平台习题)【合集】
本文介绍了C语言中的文件操作,分为两个关卡。第1关任务是将键盘输入的字符(以#结束)存入`file1.txt`并显示输出;第2关任务是从键盘输入若干行文本(每行不超过80个字符,用-1作为结束标志),写入`file2.txt`后再读取并显示。文中详细讲解了文件的打开、读取(使用`fgetc()`和`fgets()`)、写入(使用`fputc()`和`fputs()`)及关闭操作,并提供了示例代码和测试说明。
31 5
|
11天前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
41 1
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
80 10
|
1月前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
54 8

热门文章

最新文章