当前位置:   article > 正文

【C语言】文件操作函数_c语言文件操作函数

c语言文件操作函数

 

 一、文件打开与关闭

 1、fopen函数

函数原型:

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

函数功能:
fopen函数用于打开一个具有指定文件名的文件,并返回一个文件指针,以供后续的文件读写操作使用。

参数说明:

  • filename:要打开的文件名,可以包含路径信息。注意,文件名应该是一个以字符串形式表示的C字符数组。
  • mode:打开文件的模式,以字符串形式表示。通常使用以下几种模式:
    • "r":只读方式打开文件。
    • "w":写方式打开文件。如果文件不存在,则创建一个新的空文件;如果文件存在,则清空文件内容。
    • "a":追加方式打开文件。如果文件不存在,则创建一个新的空文件;如果文件存在,则将写入的数据追加到文件末尾。
    • "r+":读写方式打开文件,该文件必须已经存在。指针位于文件的开头。可以进行读取和写入操作。
    • "w+":读写方式打开文件。如果文件存在,则清空文件内容;如果文件不存在,则创建一个新的空文件。可以进行读取和写入操作。
    • "a+":读写方式打开文件。如果文件存在,则指针位于文件末尾;如果文件不存在,则创建一个新的空文件。可以进行读取和写入操作,写入的数据追加到文件末尾。
    • "rb":只读方式打开二进制文件。如果文件不存在,则打开失败。
    • "wb":写方式打开二进制文件。如果文件不存在,则创建一个新的空文件;如果文件存在,则清空文件内容。
    • "ab":追加方式打开二进制文件。如果文件不存在,则创建一个新的空文件;如果文件存在,则将写入的数据追加到文件末尾。
    • "rb+":以二进制形式的读写方式打开文件,该文件必须已经存在。指针位于文件的开头。可以进行二进制数据的读取和写入操作。
    • "wb+":以二进制形式的读写方式打开文件。如果文件存在,则清空文件内容;如果文件不存在,则创建一个新的空文件。可以进行二进制数据的读取和写入操作。
    • "ab+":以二进制形式的读写方式打开文件。如果文件存在,则指针位于文件末尾;如果文件不存在,则创建一个新的空文件。可以进行二进制数据的读取和写入操作,写入的数据追加到文件末尾。

返回值:

  • 如果成功打开文件,则返回指向 FILE 结构体的指针,称为文件指针。该文件指针用于后续对文件进行读、写或关闭等操作。
  • 如果打开文件失败,则返回 NULL

示例:

  1. FILE *file = fopen("example.txt", "r");
  2. if (file != NULL) {
  3. // 打开文件成功,进行文件读写操作
  4. fclose(file); // 关闭文件
  5. } else {
  6. // 打开文件失败,进行错误处理
  7. }

需要注意的是,在操作文件之后,应该使用 fclose 函数关闭文件,以确保文件资源被正确释放。

总结:fopen函数在C语言中用于打开文件,并返回一个指向文件的指针,可以根据指定的文件名和打开模式进行不同类型的文件操作。

2、fclose函数

函数原型:

int fclose(FILE *stream);

函数功能:
fclose函数用于关闭一个打开的文件,并释放与文件相关的资源。

参数说明:

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

返回值:

  • fclose函数返回一个整数值,表示关闭文件的状态。如果成功关闭文件,则返回0;如果关闭文件失败,则返回非零值。

示例:

  1. FILE *file = fopen("example.txt", "r");
  2. if (file != NULL) {
  3. // 对文件进行读写操作
  4. fclose(file); // 关闭文件
  5. } else {
  6. // 处理文件打开失败的情况
  7. }

在处理完文件后,应该调用fclose函数关闭文件,以确保文件资源得到正确释放。这对于避免资源泄漏和确保文件数据的完整性至关重要。

需要注意的是,fclose函数在关闭文件后,将无法再对该文件进行读写操作。因此,在调用fclose函数之后,应该确保不再需要对该文件进行操作,以免出现意外的错误。

二、文件操作函数

1、fgetc函数:
  • 原型:int fgetc(FILE *stream)
  • 功能:从文件流 stream 中获取一个字符。
  • 返回值:返回获取到的字符。如果到达文件末尾或读取失败,则返回EOF(-1)。
  • 示例:
    1. FILE *file = fopen("example.txt", "r");
    2. if (file != NULL) {
    3. int c = fgetc(file);
    4. while (c != EOF) {
    5. printf("%c", c);
    6. c = fgetc(file);
    7. }
    8. fclose(file);
    9. }
2、fputc函数
  • 原型:int fputc(int c, FILE *stream)
    • c:要写入的字符,以整数形式表示。
    • stream:指向要写入的文件的指针。
  • 功能:将字符 c 写入到文件流 stream 中。
  • 返回值:返回写入的字符。如果写入失败,则返回EOF(-1)。
  • 示例:
    1. FILE *file = fopen("example.txt", "w");
    2. if (file != NULL) {
    3. fputc('H', file);
    4. fputc('e', file);
    5. fputc('l', file);
    6. fputc('l', file);
    7. fputc('o', file);
    8. fclose(file);
    9. }
3、fgets函数
  • 原型:char *fgets(char *str, int n, FILE *stream)
    • str:指向用于存储读取的字符串的字符数组的指针。
    • n:要读取的最大字符数(包括空字符 ‘\0’)。
    • stream:指向要读取的文件的指针。
  • 功能:从文件流 stream 中读取一行字符串,并将其存储到 str 缓冲区中。
  • 返回值:返回读取到的字符串。如果到达文件末尾或读取失败,则返回NULL。
  • 示例:
    1. FILE *file = fopen("example.txt", "r");
    2. if (file != NULL) {
    3. char buffer[100];
    4. while (fgets(buffer, sizeof(buffer), file) != NULL) {
    5. printf("%s", buffer);
    6. }
    7. fclose(file);
    8. }

fgets函数易错点: 

fgets函数最多只能读取n-1个数据,因为fgets函数在读取字符串时会在最后添加一个空字符’\0’作为字符串的结束标志。所以,为了在缓冲区末尾留出空间放置空字符,实际读取的最大字符数为n-1。因此,当使用fgets函数读取字符串时,需要确保缓冲区大小至少为n个字符。

4、fputs函数
  • 原型:int fputs(const char *str, FILE *stream)
  • 功能:将字符串 str 写入到文件流 stream 中。
  • 返回值:返回非负值表示成功,返回EOF(-1)表示写入失败。
  • 示例:
    1. FILE *file = fopen("example.txt", "w");
    2. if (file != NULL) {
    3. fputs("Hello, World!", file);
    4. fclose(file);
    5. }
5、fscanf函数
  • 原型:int fscanf(FILE *stream, const char *format, ...)
    • stream:指向要读取的文件的指针。
    • format:格式化字符串,指定了读取数据的格式。
    • ...:可变数量的参数,根据format字符串中的格式指示符进行赋值。
  • 功能:从文件流 stream 中根据指定的格式字符串 format 进行格式化输入。
  • 返回值:返回成功匹配并赋值的输入项数,如果达到文件末尾或格式不匹配,则返回EOF(-1)。
  • 示例:
    1. FILE *file = fopen("example.txt", "r");
    2. if (file != NULL) {
    3. int num1, num2;
    4. fscanf(file, "%d %d", &num1, &num2);
    5. printf("Num1: %d, Num2: %d\n", num1, num2);
    6. fclose(file);
    7. }
6、fprintf函数
  • 原型:int fprintf(FILE *stream, const char *format, ...)
    • stream:指向要写入的文件的指针。
    • format:格式化字符串,指定了写入数据的格式。
    • ...:可变数量的参数,根据format字符串中的格式指示符进行匹配。
  • 功能:将格式化的数据按指定的格式字符串 format 写入到文件流 stream 中。
  • 返回值:成功写入的字符数,如果写入失败,则返回负值。
  • 示例:
    1. FILE *file = fopen("example.txt", "w");
    2. if (file != NULL) {
    3. int num1 = 10, num2 = 20;
    4. fprintf(file, "Num1: %d, Num2: %d\n", num1, num2);
    5. fclose(file);
    6. }
7、fwrite函数
  • 原型:size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream)
    • ptr:指向要写入数据块的内存地址的指针。
    • size:每个数据项的字节数。
    • count:要写入的数据项的个数。
    • stream:指向要写入的文件的指针。
  • 功能:将二进制数据块从指针 ptr 指向的内存写入到文件流 stream 中。
  • 返回值:返回实际写入的数据块个数,如果写入失败,则返回一个小于 count 的值。
  • 示例:
    1. FILE *file = fopen("example.bin", "wb");
    2. if (file != NULL) {
    3. int nums[] = {1, 2, 3, 4, 5};
    4. fwrite(nums, sizeof(int), sizeof(nums) / sizeof(int), file);
    5. fclose(file);
    6. }
8、fread函数
  • 原型:size_t fread(void *ptr, size_t size, size_t count, FILE *stream)
    • ptr:指向读取数据存储的内存地址的指针。
    • size:每个数据项的字节数。
    • count:要读取的数据项的个数。
    • stream:指向要读取的文件的指针。
  • 功能:从文件流 stream 中读取二进制数据块到指针 ptr 指向的内存中。
  • 返回值:返回实际读取的数据块个数,如果读取失败或已到达文件末尾,则返回一个小于 count 的值。
  • 示例:
    1. FILE *file = fopen("example.bin", "rb");
    2. if (file != NULL) {
    3. int nums[5];
    4. fread(nums, sizeof(int), sizeof(nums) / sizeof(int), file);
    5. fclose(file);
    6. }
9、fseek函数
  • 原型:int fseek(FILE *stream, long offset, int whence)
    • stream:指向要操作的文件的指针。
    • offset:需要偏移的字节数或记录数,根据whence的值进行解释。
    • whence:指定偏移的起点,可以是下列值之一:
      • SEEK_SET:从文件起始位置开始计算偏移(offset为正表示向文件末尾方向移动,offset为负表示向文件起始位置方向移动)。
      • SEEK_CUR:以当前位置为基点进行偏移(offset为正表示向文件末尾方向移动,offset为负表示向文件起始位置方向移动)。
      • SEEK_END:以文件末尾为基点进行偏移(offset为正表示向文件起始位置方向移动,offset为负表示向文件末尾方向移动)。
  • 功能:fseek函数将文件指针移动到offset指定的位置,位置的计算基于whence参数。移动成功后,可以在新的位置进行读取或写入操作。
  • 返回值:返回0表示成功,非零值表示失败。
  • 示例:
    1. FILE *file = fopen("example.txt", "r");
    2. if (file != NULL) {
    3. fseek(file, 5, SEEK_SET); // 将文件指针移动到文件开头偏移量为5的位置
    4. fclose(file);
    5. }
10、ftell函数

  • 原型:long ftell(FILE *stream)
  • 功能:获取文件流 stream 的当前文件指针位置。
  • 返回值:返回当前文件指针的位置(以字节为单位),如果失败,则返回-1。
  • 示例:
    1. FILE *file = fopen("example.txt", "r");
    2. if (file != NULL) {
    3. fseek(file, 0, SEEK_END); // 将文件指针移动到文件末尾
    4. long size = ftell(file); // 获取当前文件指针位置
    5. printf("File size: %ld bytes\n", size);
    6. fclose(file);
    7. }
11、rewind函数
  • 原型:void rewind(FILE *stream)
  • 功能:将文件流 stream 的文件指针重置到文件的起始位置。
  • 示例:
    1. FILE *file = fopen("example.txt", "r");
    2. if (file != NULL) {
    3. fseek(file, 0, SEEK_END); // 将文件指针移动到文件末尾
    4. rewind(file); // 将文件指针重置到文件起始位置
    5. fclose(file);
    6. }
12、feof函数
  • 原型:int feof(FILE *stream)
  • 功能:检测文件流 stream 是否已到达文件末尾。
  • 返回值:如果已到达文件末尾,返回非零值;否则,返回零。
  • 注意: 在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。 而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

  • EOF fgetc ),或者 NULL fgets )。  二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

    文本文件读取是否结束,判断返回值是否为
    • fgetc 判断是否为 EOF .
    • fgets 判断返回值是否为 NULL 
    • fread判断返回值是否小于实际要读的个数。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5.    int c; // 注意:int,非char,要求处理EOF
  6.    FILE* fp = fopen("test.txt", "r");
  7.    if(!fp) {
  8.        perror("File opening failed");
  9.        return EXIT_FAILURE;
  10.   }
  11. //fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
  12.    while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
  13.   {
  14.       putchar(c);
  15.   }
  16. //判断是什么原因结束的
  17.    if (ferror(fp))
  18.        puts("I/O error when reading");
  19.    else if (feof(fp))
  20.        puts("End of file reached successfully");
  21.    fclose(fp);
  22. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/789632
推荐阅读
相关标签
  

闽ICP备14008679号