【C语言】文件

前言

本章了解linux系统下的文件,文件指什么?怎么对文件进行操作?

1  文件

1.1  什么是文件

        在操作系统中,不同硬件设备也被看做一个文件。

例如:通常把显示器称为标准输出文件、把键盘称为标准输入文件

(信息来源:C语言中的文件是什么? (biancheng.net)

1.2  操作文件的流程

打开文件 --> 读写文件 --> 关闭文件

1.3  文件读写

        在C语言中,文件有多种读写方式,可以一个字符一个字符地读取,也可以读取一整行,还可以读取若干个字节。文件的读写位置也非常灵活,可以从文件开头读取,也可以从中间位置读取。

2  文件流

        文件流(File Streams)是指在程序中用于读取和写入文件的抽象概念。它提供了一种逻辑上的数据流,使得程序可以像读写内存或其他数据源一样读写文件。

2.1  打开文件流

使用相应的函数或方法打开文件流,将文件与文件流关联起来。

这通常涉及指定文件的路径、打开模式(读取、写入、追加等)以及访问权限等参数。

fopen()函数

函数声明:FILE* fopen(const char* filename, const char* mode);

该函数接受两个参数:

  • filename:表示要打开的文件的路径和名称,以字符串形式提供。

  • mode:表示打开文件的模式,以字符串形式提供。模式参数可以是以下之一:

    • "r":只读模式,打开已存在的文件进行读取。
    • "w":写入模式,创建一个新文件进行写入。如果文件已存在,则会清空文件内容。
    • "a":追加模式,打开已存在的文件进行追加写入。如果文件不存在,则创建一个新文件。
    • "rb""wb""ab":类似的模式,但用于以二进制形式读取或写入文件。

fopen()函数会返回一个指向FILE结构的指针,该指针用于后续对文件流进行操作。

#include <stdio.h>

int main() {
    FILE* file = fopen("file.txt", "r");
    if (file == NULL) {
        printf("Failed to open the file.\n");
        return 1;
    }
    
    // 文件流打开成功,可以进行后续的读取或写入操作
    
    // 关闭文件流
    fclose(file);
    
    return 0;
}

2.2  读取文件流

2.2.1  fscanf()函数

作用:它可以根据格式字符串的要求,从文件流中读取数据并将其存储到相应的变量中。

函数声明:int fscanf(FILE* stream, const char* format, ...);

它接受三个参数:

  • stream:指向要读取的文件流的指针(通过fopen()函数打开文件后返回的指针)。
  • format:格式字符串,用于指定读取数据的格式和要读取的数据类型。
  • ...:可变参数,用于指定要读取数据的目标变量。
#include <stdio.h>

int main() {
    FILE* file = fopen("file.txt", "r");
    if (file == NULL) {
        printf("Failed to open the file.\n");
        return 1;
    }

    int num1, num2;
    fscanf(file, "%d %d", &num1, &num2);  // 从文件中读取两个整数

    printf("Read integers: %d, %d\n", num1, num2);

    fclose(file);
    return 0;
}

2.2.2  fgets()函数

作用:fgets()函数用于从文件流中逐行读取文本内容。它可以读取包括换行符在内的整行文本,并将其存储到指定的缓冲区中。

函数声明:char* fgets(char* str, int size, FILE* stream);

它接受三个参数:

  • str:指向存储读取文本的字符数组(缓冲区)的指针。
  • size:缓冲区的大小,用于限制读取的字符数。
  • stream:指向要读取的文件流的指针(通过fopen()函数打开文件后返回的指针)
#include <stdio.h>

int main() {
    FILE* file = fopen("file.txt", "r");
    if (file == NULL) {
        printf("Failed to open the file.\n");
        return 1;
    }

    char buffer[100];
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);  // 打印读取的文本行
    }

    fclose(file);
    return 0;
}

2.3  写入文件流

2.3.1  fprintf()函数

作用:用于将格式化的数据写入文件流

函数声明:int fprintf(FILE* stream, const char* format, ...);

它接受多个参数:

  • stream:指向要写入的文件流的指针(通过fopen()函数打开文件后返回的指针)。
  • format:格式字符串,用于指定要写入的数据的格式和输出样式。
  • ...:可变参数,用于指定要写入的数据。
#include <stdio.h>

int main() {
    FILE* file = fopen("file.txt", "w");
    if (file == NULL) {
        printf("Failed to open the file.\n");
        return 1;
    }

    int num = 123;
    double pi = 3.14159;
    char str[] = "Hello, World!";

    fprintf(file, "Number: %d\n", num);
    fprintf(file, "Pi: %.2f\n", pi);
    fprintf(file, "String: %s\n", str);

    fclose(file);
    return 0;
}

2.3.2  fputc()函数

作用:用于将单个字符 写入文件流

函数声明:int fputs(const char *str, FILE *stream);

它接受两个参数:

  • c:要写入的字符(以整数形式传递,因为字符是通过其ASCII码表示的)。
  • stream:指向要写入的文件流的指针(通过fopen()函数打开文件后返回的指针)。
#include <stdio.h>

int main() {
    FILE* file = fopen("file.txt", "w");
    if (file == NULL) {
        printf("Failed to open the file.\n");
        return 1;
    }

    fputc('H', file);  // 写入字符'H'
    fputc('e', file);  // 写入字符'e'
    fputc('l', file);  // 写入字符'l'
    fputc('l', file);  // 写入字符'l'
    fputc('o', file);  // 写入字符'o'

    fclose(file);
    return 0;
}

2.3.3  fputs()函数

作用:用于将字符串写入文件流

函数声明:int fputs(const char* str, FILE* stream);

它接受两个参数:

  • str:指向要写入的字符串的指针。
  • stream:指向要写入的文件流的指针(通过fopen()函数打开文件后返回的指针)。

返回:一个非负整数表示成功写入的字符数。如果写入失败,它会返回EOF(-1)。

#include <stdio.h>

int main() {
    FILE* file = fopen("file.txt", "w");
    if (file == NULL) {
        printf("Failed to open the file.\n");
        return 1;
    }

    char str1[] = "Hello, World!";
    char str2[] = "This is a line of text.";

    fputs(str1, file);
    fputs("\n", file);  // 写入换行符
    fputs(str2, file);

    fclose(file);
    return 0;
}

2.4  定位文件流指针

文件流通常有一个指针,指示当前读写位置。可以使用相关函数或方法来定位指针到文件中的特定位置,以便进行随机访问或修改。

2.4.1  fseek()函数

在C语言中,可以使用fseek()函数来定位文件流的指针。fseek()函数允许将文件流的指针移动到文件中的特定位置,以便进行读取或写入操作。

函数原型:int fseek(FILE* stream, long offset, int origin);

它接受三个参数:

  • stream:指向要定位的文件流的指针(通过fopen()函数打开文件后返回的指针)。
  • offset:表示指针移动的字节数,可以是正数、负数或零。
  • origin:表示指针的起始位置,可以是以下常量之一:
    • SEEK_SET:从文件开头开始计算偏移量。
    • SEEK_CUR:从当前指针位置开始计算偏移量。
    • SEEK_END:从文件末尾开始计算偏移量。
#include <stdio.h>

int main() {
    FILE* file = fopen("file.txt", "r");
    if (file == NULL) {
        printf("Failed to open the file.\n");
        return 1;
    }

    // 将文件指针移动到文件的第三个字节处
    fseek(file, 2, SEEK_SET);

    // 读取并打印文件中的剩余内容
    int ch;
    while ((ch = fgetc(file)) != EOF) {
        putchar(ch);
    }

    fclose(file);
    return 0;
}

2.5  关闭文件流

在操作完成后,应当使用相应的函数或方法关闭文件流,释放相关的资源。关闭文件流时,通常会将缓冲区中的数据刷新到文件中。

2.5.1  fclose()函数

在C语言中,可以使用fclose()函数来关闭文件流。fclose()函数用于关闭之前通过fopen()freopen()等函数打开的文件流,并释放与文件流相关的资源。

函数原型:int fclose(FILE* stream);

它接受一个参数:

  • stream:指向要关闭的文件流的指针。
#include <stdio.h>

int main() {
    FILE* file = fopen("file.txt", "r");
    if (file == NULL) {
        printf("Failed to open the file.\n");
        return 1;
    }

    // 读取文件中的内容
    // ...

    // 关闭文件流
    fclose(file);

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值