【C语言】---- 文件输入输出与文件管理函数

1 文件输入输出函数

1.1 打开和关闭文件

1.1.1 fopen函数

fopen 是 C 标准库中用于打开文件的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

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

这个函数接受两个参数:

  • filename:一个以字符串形式表示的文件名,用于指定要打开的文件的名称和路径。
  • mode:一个以字符串形式表示的打开模式,用于指定文件的打开方式。

fopen 函数返回一个指向 FILE 结构的指针,该结构用于表示文件流。如果打开文件失败,则返回 NULL

打开模式指定了文件的打开方式,包括读取、写入、追加等操作。常见的打开模式包括:

  • "r":只读模式,打开一个已存在的文本文件,文件指针位于文件开头。
  • "w":写入模式,打开一个文本文件进行写入,如果文件不存在则创建,如果文件已存在则清空内容,文件指针位于文件开头。
  • "a":追加模式,打开一个文本文件进行写入,如果文件不存在则创建,文件指针位于文件末尾。
  • "r+":读写模式,打开一个已存在的文本文件,文件指针位于文件开头。
  • "w+":读写模式,打开一个文本文件进行读写,如果文件不存在则创建,如果文件已存在则清空内容,文件指针位于文件开头。
  • "a+":读写模式,打开一个文本文件进行读写,如果文件不存在则创建,文件指针位于文件末尾。

此外,还有对应的二进制文件打开模式,如 "rb", "wb", "ab", "rb+", "wb+", "ab+"

以下是一个示例代码,演示了如何使用 fopen 函数打开文件并进行读取或写入操作:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    char mode[] = "r";

    // 打开一个文件进行读取操作
    file = fopen(filename, mode);

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 进行读取操作...

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 "r" 模式打开了一个名为 example.txt 的文件进行读取操作。如果文件打开失败,则输出一条错误信息。最后,使用 fclose 函数关闭文件流。

1.1.2 fclose函数

fclose 是 C 标准库中用于关闭文件的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int fclose(FILE *stream);

这个函数接受一个参数:

  • stream:一个指向 FILE 结构的指针,表示要关闭的文件流。

fclose 函数用于关闭之前使用 fopen 函数打开的文件。它会刷新文件缓冲区中的数据,将所有的缓冲区数据写入文件,并释放文件相关的资源。成功关闭文件时,返回 0;关闭失败时,返回一个非零值。

以下是一个示例代码,演示了如何使用 fclose 函数关闭文件:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    char mode[] = "r";

    // 打开一个文件进行读取操作
    file = fopen(filename, mode);

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 进行读取操作...

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

    return 0;
}

在这个示例中,我们使用 fclose 函数关闭了之前打开的文件。如果关闭成功,则输出一条消息表示文件已成功关闭;如果关闭失败,则输出一条错误消息。

1.2 读取和写入数据

1.2.1 fread函数

fread 是 C 标准库中用于从文件中读取数据的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

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

这个函数接受四个参数:

  • ptr:一个指向数据存储位置的指针,用于存储从文件中读取的数据。
  • size:要读取的每个数据项的大小(以字节为单位)。
  • nmemb:要读取的数据项的数量。
  • stream:一个指向 FILE 结构的指针,表示要读取数据的文件流。

fread 函数从指定的文件流中读取数据,并将数据存储到指定的内存位置。它会尝试从文件中读取 size * nmemb 个字节的数据,并将读取到的数据存储到 ptr 指向的内存位置。成功读取的数据项数量将被返回,如果到达文件结尾或发生错误,则返回一个小于 nmemb 的值。

以下是一个示例代码,演示了如何使用 fread 函数从文件中读取数据:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.bin";
    char buffer[100];
    size_t read_count;

    // 打开一个二进制文件进行读取操作
    file = fopen(filename, "rb");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 从文件中读取数据
    read_count = fread(buffer, sizeof(char), 100, file);

    // 检查读取结果
    if (read_count > 0) {
        printf("成功读取了 %zu 个字节的数据\n", read_count);
        // 对读取到的数据进行处理...
    } else {
        printf("读取文件时发生错误\n");
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.bin 的二进制文件进行读取操作。然后,我们使用 fread 函数从文件中读取了最多 100 个字节的数据,并将读取到的数据存储到 buffer 数组中。最后,我们检查了读取到的数据项数量,并对读取到的数据进行了处理。

1.2.2 fwrite函数

fwrite 是 C 标准库中用于向文件中写入数据的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

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

这个函数接受四个参数:

  • ptr:一个指向数据的指针,指向要写入文件的数据。
  • size:要写入的每个数据项的大小(以字节为单位)。
  • nmemb:要写入的数据项的数量。
  • stream:一个指向 FILE 结构的指针,表示要写入数据的文件流。

fwrite 函数将数据从指定的内存位置写入到指定的文件流中。它会尝试将 size * nmemb 个字节的数据从 ptr 指向的内存位置写入到文件流中。成功写入的数据项数量将被返回,如果发生错误,则返回一个小于 nmemb 的值。

以下是一个示例代码,演示了如何使用 fwrite 函数向文件中写入数据:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    char buffer[] = "Hello, world!";
    size_t write_count;

    // 打开一个文本文件进行写入操作
    file = fopen(filename, "w");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 向文件中写入数据
    write_count = fwrite(buffer, sizeof(char), sizeof(buffer), file);

    // 检查写入结果
    if (write_count > 0) {
        printf("成功写入了 %zu 个字节的数据\n", write_count);
    } else {
        printf("写入文件时发生错误\n");
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行写入操作。然后,我们使用 fwrite 函数将包含 "Hello, world!" 字符串的缓冲区数据写入到文件中。最后,我们检查了写入到文件的数据项数量,并输出了相应的结果。

1.3 文件检查

1.3.1 feof函数

feof 是 C 标准库中用于检查文件流是否已经到达文件结尾的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int feof(FILE *stream);

这个函数接受一个参数:

  • stream:一个指向 FILE 结构的指针,表示要检查的文件流。

feof 函数用于检查指定的文件流是否已经到达了文件结尾。如果文件流已经到达了文件结尾,则返回非零值(即真);否则返回 0(即假)。

通常,feof 函数用于在读取文件时判断是否已经读取完整个文件。

以下是一个示例代码,演示了如何使用 feof 函数检查文件流是否已经到达文件结尾:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    char ch;

    // 打开一个文本文件进行读取操作
    file = fopen(filename, "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 读取文件内容并输出
    while (!feof(file)) {
        ch = fgetc(file);
        if (!feof(file)) {
            printf("%c", ch);
        }
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行读取操作。然后,我们使用 feof 函数在读取文件内容时循环检查文件流是否已经到达了文件结尾。最后,我们关闭了文件流。

1.3.2 ferror函数

ferror 是 C 标准库中用于检查文件流是否发生了错误的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int ferror(FILE *stream);

这个函数接受一个参数:

  • stream:一个指向 FILE 结构的指针,表示要检查的文件流。

ferror 函数用于检查指定的文件流是否发生了错误。如果文件流发生了错误,则返回非零值(即真);否则返回 0(即假)。

通常,ferror 函数用于在文件操作过程中检查是否发生了错误,以及在发生错误时采取相应的错误处理措施。

以下是一个示例代码,演示了如何使用 ferror 函数检查文件流是否发生了错误:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";

    // 打开一个不存在的文件进行写入操作
    file = fopen(filename, "w");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 在写入数据之前检查文件流是否发生了错误
    if (ferror(file)) {
        printf("文件流发生了错误\n");
    } else {
        printf("文件流未发生错误\n");
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个不存在的文件 example.txt 进行写入操作。然后,我们使用 ferror 函数在写入数据之前检查文件流是否发生了错误,并输出相应的消息。最后,我们关闭了文件流。

1.4 文件流中的字符输入输出

1.4.1 fgetc函数

fgetc 是 C 标准库中用于从文件中读取一个字符的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int fgetc(FILE *stream);

这个函数接受一个参数:

  • stream:一个指向 FILE 结构的指针,表示要读取字符的文件流。

fgetc 函数从指定的文件流中读取一个字符,并返回读取到的字符的 ASCII 码值。如果读取成功,则返回读取到的字符的 ASCII 码值;如果到达文件结尾或发生错误,则返回 EOF(通常是 -1)。

通常,fgetc 函数用于逐个字符地读取文件内容,直到文件结束。

以下是一个示例代码,演示了如何使用 fgetc 函数从文件中逐个字符地读取内容:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    char ch;

    // 打开一个文本文件进行读取操作
    file = fopen(filename, "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 逐个字符读取文件内容并输出
    while ((ch = fgetc(file)) != EOF) {
        printf("%c", ch);
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行读取操作。然后,我们使用 fgetc 函数逐个字符地从文件中读取内容,并输出到控制台。当读取到文件结尾时,fgetc 函数返回 EOF,循环结束。最后,我们关闭了文件流。

1.4.2 fgets函数

fgets 是 C 标准库中用于从文件中读取一行字符串的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

char *fgets(char *s, int size, FILE *stream);

这个函数接受三个参数:

  • s:一个指向字符数组的指针,用于存储读取到的字符串。
  • size:要读取的最大字符数(包括结尾的空字符 \0)。
  • stream:一个指向 FILE 结构的指针,表示要读取数据的文件流。

fgets 函数从指定的文件流中读取一行字符串,并将其存储到指定的字符数组中。它会一直读取字符,直到遇到换行符 \n、到达指定的字符数限制、到达文件结尾或发生错误为止。读取到的字符串将以 null 结尾,并包含换行符(如果存在)。

通常,fgets 函数用于按行读取文本文件的内容。

以下是一个示例代码,演示了如何使用 fgets 函数从文件中逐行读取内容:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    char buffer[100];

    // 打开一个文本文件进行读取操作
    file = fopen(filename, "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 逐行读取文件内容并输出
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行读取操作。然后,我们使用 fgets 函数逐行读取文件内容,并输出到控制台。当读取到文件结尾时,fgets 函数返回 NULL,循环结束。最后,我们关闭了文件流。

1.4.3 fputc函数

fputc 是 C 标准库中用于向文件中写入一个字符的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int fputc(int c, FILE *stream);

这个函数接受两个参数:

  • c:要写入文件的字符,以 ASCII 码值的形式传递。
  • stream:一个指向 FILE 结构的指针,表示要写入数据的文件流。

fputc 函数将指定的字符写入到指定的文件流中,并返回写入的字符的 ASCII 码值。如果写入成功,则返回写入的字符的 ASCII 码值;如果发生错误,则返回 EOF(通常是 -1)。

通常,fputc 函数用于逐个字符地写入文件内容。

以下是一个示例代码,演示了如何使用 fputc 函数向文件中逐个字符地写入内容:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    char ch;

    // 打开一个文本文件进行写入操作
    file = fopen(filename, "w");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 向文件中逐个字符地写入内容
    for (ch = 'A'; ch <= 'Z'; ch++) {
        fputc(ch, file);
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行写入操作。然后,我们使用 fputc 函数逐个字符地向文件中写入从 'A' 到 'Z' 的字母。最后,我们关闭了文件流。

1.4.4 fputs函数

fputs 是 C 标准库中用于向文件中写入字符串的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int fputs(const char *s, FILE *stream);

这个函数接受两个参数:

  • s:一个以 null 结尾的字符串,表示要写入文件的字符串。
  • stream:一个指向 FILE 结构的指针,表示要写入数据的文件流。

fputs 函数将指定的字符串写入到指定的文件流中,并返回一个非负数表示成功,或者返回 EOF(通常是 -1)表示失败。

fputs 相似的还有 puts 函数,但 puts 函数将字符串写入标准输出(通常是屏幕),而不是文件。

以下是一个示例代码,演示了如何使用 fputs 函数向文件中写入字符串:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    char str[] = "Hello, world!";

    // 打开一个文本文件进行写入操作
    file = fopen(filename, "w");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 向文件中写入字符串
    if (fputs(str, file) != EOF) {
        printf("成功写入字符串到文件\n");
    } else {
        printf("写入文件时发生错误\n");
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行写入操作。然后,我们使用 fputs 函数将字符串 "Hello, world!" 写入到文件中。最后,我们关闭了文件流。

1.5 文件流中的标准输入输出

1.5.1 fprintf函数

fprintf 是 C 标准库中用于向文件中写入格式化数据的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

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

这个函数接受一个或多个参数:

  • stream:一个指向 FILE 结构的指针,表示要写入数据的文件流。
  • format:一个以字符串形式表示的格式化控制字符串,用于指定输出的格式。
  • ...:表示可变数量的参数列表,用于传递要格式化输出的数据。

fprintf 函数根据指定的格式控制字符串,将格式化数据写入到指定的文件流中。它的用法类似于 printf 函数,但 fprintf 输出到文件流而不是标准输出流。

以下是一个示例代码,演示了如何使用 fprintf 函数向文件中写入格式化数据:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    int num = 10;
    float pi = 3.14159;

    // 打开一个文本文件进行写入操作
    file = fopen(filename, "w");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 向文件中写入格式化数据
    fprintf(file, "整数:%d\n", num);
    fprintf(file, "浮点数:%f\n", pi);

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行写入操作。然后,我们使用 fprintf 函数向文件中写入了一个整数和一个浮点数,并指定了相应的格式。最后,我们关闭了文件流。

1.5.2 fscanf函数

fscanf 是 C 标准库中用于从文件中读取格式化数据的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

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

这个函数接受一个或多个参数:

  • stream:一个指向 FILE 结构的指针,表示要读取数据的文件流。
  • format:一个以字符串形式表示的格式化控制字符串,用于指定输入的格式。
  • ...:表示可变数量的参数列表,用于传递要读取的数据。

fscanf 函数根据指定的格式控制字符串,从指定的文件流中读取数据并将其存储到指定的变量中。它的用法类似于 scanf 函数,但 fscanf 从文件流中读取数据而不是标准输入流。

以下是一个示例代码,演示了如何使用 fscanf 函数从文件中读取格式化数据:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    int num;
    float pi;

    // 打开一个文本文件进行读取操作
    file = fopen(filename, "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 从文件中读取格式化数据
    fscanf(file, "整数:%d\n", &num);
    fscanf(file, "浮点数:%f\n", &pi);

    // 输出读取到的数据
    printf("整数:%d\n", num);
    printf("浮点数:%f\n", pi);

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行读取操作。然后,我们使用 fscanf 函数从文件中读取了一个整数和一个浮点数,并将它们存储到相应的变量中。最后,我们输出了读取到的数据,并关闭了文件流。

1.6 文件定位

1.6.1 fseek函数

fseek 是 C 标准库中用于设置文件位置指针的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

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

这个函数接受三个参数:

  • stream:一个指向 FILE 结构的指针,表示要设置位置指针的文件流。
  • offset:偏移量,表示要移动的字节数。
  • whence:指定起始位置的方式,可以是 SEEK_SETSEEK_CURSEEK_END

fseek 函数用于设置指定文件流的位置指针,以便在文件中进行随机访问。根据 whence 参数的不同,offset 表示相对于文件起始位置、当前位置或文件末尾的偏移量。成功设置位置指针后,fseek 返回 0;如果发生错误,则返回一个非零值。

以下是 whence 参数的三种取值:

  • SEEK_SET:将位置指针设置到文件开头加上 offset 字节处。
  • SEEK_CUR:将位置指针设置到当前位置加上 offset 字节处。
  • SEEK_END:将位置指针设置到文件末尾加上 offset 字节处。

以下是一个示例代码,演示了如何使用 fseek 函数在文件中设置位置指针:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    long int offset = 10;

    // 打开一个文本文件进行读取操作
    file = fopen(filename, "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 设置位置指针到文件末尾
    if (fseek(file, -offset, SEEK_END) == 0) {
        printf("位置指针成功设置到文件末尾向前 %ld 字节\n", offset);
    } else {
        printf("设置位置指针时发生错误\n");
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行读取操作。然后,我们使用 fseek 函数将位置指针设置到文件末尾向前偏移 10 个字节处。如果设置成功,我们输出相应的消息;如果设置失败,我们输出错误消息。最后,我们关闭了文件流。

1.6.2 ftell函数

ftell 是 C 标准库中用于获取文件位置指针当前位置的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

long int ftell(FILE *stream);

这个函数接受一个参数:

  • stream:一个指向 FILE 结构的指针,表示要获取位置指针当前位置的文件流。

ftell 函数用于获取指定文件流的位置指针当前位置相对于文件开头的偏移量,以字节为单位。如果成功获取当前位置,则返回当前位置相对于文件开头的偏移量;如果发生错误,则返回 -1。

通常,ftell 函数用于获取文件流的当前位置,以便在需要的时候进行随机访问。

以下是一个示例代码,演示了如何使用 ftell 函数获取文件位置指针当前位置:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    long int position;

    // 打开一个文本文件进行读取操作
    file = fopen(filename, "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 获取文件位置指针当前位置
    position = ftell(file);

    // 检查获取位置是否成功
    if (position != -1) {
        printf("文件位置指针当前位置:%ld 字节\n", position);
    } else {
        printf("获取文件位置指针当前位置时发生错误\n");
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行读取操作。然后,我们使用 ftell 函数获取文件位置指针当前位置,并输出到控制台。最后,我们关闭了文件流。

1.6.3 fgetpos函数

fgetpos 是 C 标准库中用于获取文件位置指针当前位置的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int fgetpos(FILE *stream, fpos_t *pos);

这个函数接受两个参数:

  • stream:一个指向 FILE 结构的指针,表示要获取位置指针当前位置的文件流。
  • pos:一个指向 fpos_t 类型的指针,用于存储获取的文件位置指针当前位置。

fgetpos 函数用于获取指定文件流的位置指针当前位置,并将其存储到指定的位置。

fgetposftell 类似,但 fgetpos 返回的位置类型是 fpos_t,而不是 long int。这个类型是平台特定的,并且可以表示文件中任意位置的偏移量。

以下是一个示例代码,演示了如何使用 fgetpos 函数获取文件位置指针当前位置:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    fpos_t position;

    // 打开一个文本文件进行读取操作
    file = fopen(filename, "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 获取文件位置指针当前位置
    if (fgetpos(file, &position) == 0) {
        printf("文件位置指针当前位置:%lld 字节\n", (long long)position);
    } else {
        printf("获取文件位置指针当前位置时发生错误\n");
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行读取操作。然后,我们使用 fgetpos 函数获取文件位置指针当前位置,并输出到控制台。最后,我们关闭了文件流。

1.6.4 fsetpos函数

fsetpos 是 C 标准库中用于设置文件位置指针的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int fsetpos(FILE *stream, const fpos_t *pos);

这个函数接受两个参数:

  • stream:一个指向 FILE 结构的指针,表示要设置位置指针的文件流。
  • pos:一个指向 fpos_t 类型的指针,表示要设置的文件位置。

fsetpos 函数用于设置指定文件流的位置指针,以便在文件中进行随机访问。它与 fseek 函数的不同之处在于,fsetpos 使用的位置类型是 fpos_t,而不是简单的偏移量。

以下是一个示例代码,演示了如何使用 fsetpos 函数在文件中设置位置指针:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    fpos_t position;

    // 打开一个文本文件进行读取操作
    file = fopen(filename, "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 获取文件位置指针当前位置
    if (fgetpos(file, &position) != 0) {
        printf("获取文件位置指针当前位置时发生错误\n");
        fclose(file);
        return 1;
    }

    // 设置位置指针到文件开头
    if (fsetpos(file, &position) == 0) {
        printf("位置指针成功设置到文件开头\n");
    } else {
        printf("设置位置指针时发生错误\n");
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行读取操作。然后,我们使用 fgetpos 函数获取文件位置指针当前位置,并将其存储到 position 变量中。接着,我们使用 fsetpos 函数将位置指针重新设置到文件开头。如果设置成功,我们输出相应的成功消息;如果失败,我们输出错误消息。最后,我们关闭了文件流。

1.6.5 rewind函数

rewind 是 C 标准库中用于将文件位置指针重新设置到文件开头的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

void rewind(FILE *stream);

这个函数接受一个参数:

  • stream:一个指向 FILE 结构的指针,表示要重新设置位置指针的文件流。

rewind 函数将指定文件流的位置指针重新设置到文件开头,相当于调用 fseek(stream, 0, SEEK_SET)。它用于在文件操作中需要重新读取文件内容时将位置指针复位。

以下是一个示例代码,演示了如何使用 rewind 函数将文件位置指针重新设置到文件开头:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    char ch;

    // 打开一个文本文件进行读取操作
    file = fopen(filename, "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 读取并输出文件内容
    while ((ch = fgetc(file)) != EOF) {
        printf("%c", ch);
    }

    // 将文件位置指针重新设置到文件开头
    rewind(file);

    // 重新读取并输出文件内容
    printf("\n重新读取文件内容:\n");
    while ((ch = fgetc(file)) != EOF) {
        printf("%c", ch);
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行读取操作。然后,我们使用 fgetc 函数逐个字符地读取文件内容,并输出到控制台。接着,我们使用 rewind 函数将文件位置指针重新设置到文件开头,然后再次读取并输出文件内容。最后,我们关闭了文件流。

2 文件管理函数

2.1 文件重命名和删除

2.1.1 rename函数

rename 是 C 标准库中用于修改文件名或将文件移动到不同位置的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int rename(const char *old_filename, const char *new_filename);

这个函数接受两个参数:

  • old_filename:指向以 null 结尾的字符串的指针,表示要修改的文件的当前名称。
  • new_filename:指向以 null 结尾的字符串的指针,表示要为文件指定的新名称。

rename 函数用于将指定的文件重命名为新的文件名。如果重命名成功,则返回 0;如果失败,则返回非零值。通常,重命名操作可能失败的原因包括文件不存在、权限不足、文件名无效等。

以下是一个示例代码,演示了如何使用 rename 函数将文件重命名:

#include <stdio.h>

int main() {
    char old_filename[] = "oldfile.txt";
    char new_filename[] = "newfile.txt";

    // 将文件 oldfile.txt 重命名为 newfile.txt
    if (rename(old_filename, new_filename) == 0) {
        printf("文件重命名成功\n");
    } else {
        printf("文件重命名失败\n");
    }

    return 0;
}

在这个示例中,我们尝试将名为 oldfile.txt 的文件重命名为 newfile.txt。如果重命名成功,我们输出相应的成功消息;如果失败,我们输出失败消息。

2.1.2 remove函数

remove 是 C 标准库中用于删除文件的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int remove(const char *filename);

这个函数接受一个参数:

  • filename:指向以 null 结尾的字符串的指针,表示要删除的文件的名称。

remove 函数用于删除指定的文件。如果删除成功,则返回 0;如果失败,则返回非零值。通常,删除文件可能失败的原因包括文件不存在、权限不足等。

以下是一个示例代码,演示了如何使用 remove 函数删除文件:

#include <stdio.h>

int main() {
    char filename[] = "example.txt";

    // 尝试删除文件 example.txt
    if (remove(filename) == 0) {
        printf("文件删除成功\n");
    } else {
        printf("文件删除失败\n");
    }

    return 0;
}

在这个示例中,我们尝试删除名为 example.txt 的文件。如果删除成功,我们输出相应的成功消息;如果失败,我们输出失败消息。

2.2 临时文件操作

2.2.1 tmpfile函数

tmpfile 是 C 标准库中用于创建临时文件的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

FILE *tmpfile(void);

tmpfile 函数用于创建一个临时文件,这个文件通常是匿名的,不会在文件系统中保留文件名。临时文件通常用于在程序运行期间存储临时数据。这个函数返回一个指向 FILE 结构的指针,表示创建的临时文件流。

使用 tmpfile 创建的临时文件在程序结束时会自动删除,因此不需要手动删除临时文件。

以下是一个示例代码,演示了如何使用 tmpfile 函数创建临时文件:

#include <stdio.h>

int main() {
    FILE *tmp_file;

    // 创建一个临时文件
    tmp_file = tmpfile();

    // 检查临时文件是否成功创建
    if (tmp_file == NULL) {
        printf("无法创建临时文件\n");
        return 1;
    }

    printf("临时文件创建成功\n");

    // 在这里可以对临时文件进行读写操作

    // 关闭临时文件
    fclose(tmp_file);

    return 0;
}

在这个示例中,我们使用 tmpfile 函数创建了一个临时文件,并将返回的文件流指针存储在 tmp_file 变量中。如果临时文件成功创建,我们输出相应的成功消息。在程序的其他部分,可以对临时文件进行读写操作。最后,我们关闭了临时文件流。由于创建的是临时文件,因此在程序结束时会自动删除。

2.2.2 tmpnam函数

tmpnam 是 C 标准库中用于生成唯一临时文件名的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

char *tmpnam(char *s);

这个函数接受一个参数:

  • s:一个指向字符数组的指针,用于存储生成的临时文件名。

tmpnam 函数用于生成一个唯一的临时文件名,并将这个文件名存储到指定的字符数组中。如果 s 参数为 NULL,则 tmpnam 函数会使用静态内部缓冲区来存储生成的临时文件名,并返回指向这个缓冲区的指针。如果 s 参数不为 NULL,则 tmpnam 函数会将生成的临时文件名复制到 s 指向的字符数组中,并返回 s 的值。

注意:由于 tmpnam 函数使用的算法可能不够安全,因此在安全性要求较高的环境中,建议使用更安全的 tmpnam_r 函数。

以下是一个示例代码,演示了如何使用 tmpnam 函数生成临时文件名:

#include <stdio.h>

int main() {
    char temp_name[L_tmpnam]; // 存储临时文件名的字符数组

    // 生成临时文件名并存储到 temp_name 中
    if (tmpnam(temp_name) == NULL) {
        printf("无法生成临时文件名\n");
        return 1;
    }

    printf("生成的临时文件名为:%s\n", temp_name);

    return 0;
}

在这个示例中,我们使用 tmpnam 函数生成了一个临时文件名,并将其存储到 temp_name 字符数组中。如果成功生成临时文件名,我们输出相应的临时文件名。

2.3 文件信息查询

2.3.1 fflush函数

fflush 是 C 标准库中用于刷新缓冲区的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int fflush(FILE *stream);

这个函数接受一个参数:

  • stream:一个指向 FILE 结构的指针,表示要刷新缓冲区的文件流。

fflush 函数用于刷新指定文件流的缓冲区。如果 stream 参数为 NULL,则 fflush 函数会刷新所有打开的输出流的缓冲区。

通常,在标准输出流中,缓冲区会在遇到换行符 \n、缓冲区已满时、调用 fflush 函数时或程序正常结束时自动刷新。但在某些情况下,需要立即将缓冲区的内容输出到目标设备(如屏幕或文件),这时可以调用 fflush 函数来实现。

以下是一个示例代码,演示了如何使用 fflush 函数刷新缓冲区:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";

    // 打开一个文本文件进行写入操作
    file = fopen(filename, "w");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 向文件中写入数据
    fputs("Hello, world!", file);

    // 刷新缓冲区,将数据写入文件
    if (fflush(file) == 0) {
        printf("缓冲区已成功刷新\n");
    } else {
        printf("刷新缓冲区时发生错误\n");
    }

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行写入操作。然后,我们使用 fputs 函数向文件中写入字符串 "Hello, world!"。最后,我们使用 fflush 函数刷新文件流的缓冲区,将数据写入文件。

2.3.2 fileno函数

fileno 是 C 标准库中用于获取文件描述符的函数之一。它的原型定义在 <stdio.h> 头文件中,具体格式如下:

int fileno(FILE *stream);

这个函数接受一个参数:

  • stream:一个指向 FILE 结构的指针,表示要获取文件描述符的文件流。

fileno 函数用于获取指定文件流的底层文件描述符。文件描述符是一个整数,用于标识打开的文件或其他 I/O 设备。在 UNIX 和类 UNIX 系统中,文件描述符通常是一个小于 0 的整数。

以下是一个示例代码,演示了如何使用 fileno 函数获取文件描述符:

#include <stdio.h>

int main() {
    FILE *file;
    char filename[] = "example.txt";
    int fd;

    // 打开一个文本文件进行读取操作
    file = fopen(filename, "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 获取文件描述符
    fd = fileno(file);
    printf("文件描述符:%d\n", fd);

    // 关闭文件
    fclose(file);

    return 0;
}

在这个示例中,我们使用 fopen 函数打开了一个名为 example.txt 的文本文件进行读取操作。然后,我们使用 fileno 函数获取文件流 file 的文件描述符,并将其存储到 fd 变量中。最后,我们输出获取到的文件描述符,并关闭了文件流。

posted @ 2024-05-03 23:25  晚风也温柔  阅读(49)  评论(0编辑  收藏  举报