震惊!C语言是这样操作文件的!

文件指针概述

1,在C语言中,文件指针是一个用于在程序中操作文件的特殊类型指针。文件指针用于跟踪文件中的位置,以便在文件中执行读取和写入操作。

2,常见的文件指针类型是FILE,它是C标准库中定义的一种结构类型。通常,我们使用 FILE* 类型的指针来引用一个文件。

文件指针的主要作用是

1,定位文件位置:文件指针跟踪文件中当前的读/写位置。在文件操作期间,指针会根据读写操作的进行而自动移动到相应的位置。

2,进行文件操作:通过文件指针,可以进行文件的读取、写入和定位等操作。

在文件操作中,文件指针的一般流程是

1,使用fopen()函数打开文件时,该函数返回一个指向文件的指针。

2,通过该指针执行读取和写入操作,例如使用fscanf()、fprintf()等函数。

3,最后使用fclose()函数关闭文件,并释放文件指针所占用的资源。

举个例子:

#include <stdio.h>

int main() {
    FILE *filePointer;   //定义指针,命名
    char data[100];

    // 打开文件以供写入
    filePointer = fopen("example.txt", "w");
    if (filePointer == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 写入数据到文件
    fprintf(filePointer, "Hello, World!\n");
    fprintf(filePointer, "This is a test message.\n");

    // 关闭文件
    fclose(filePointer);

    // 打开文件以供读取
    filePointer = fopen("example.txt", "r");
    if (filePointer == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 从文件读取数据并打印到控制台
    while (fgets(data, 100, filePointer) != NULL) {
        printf("%s", data);
    }

    // 关闭文件
    fclose(filePointer);

    return 0;
}

文件指针打开模式

打开文件:使用fopen()函数打开文件,语法如下:

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

filename参数是要打开的文件名;

mode参数表示打开文件的模式;
常见的模式有

  • “r”:只读模式,文件必须存在;

  • “w”:写入模式,如果文件存在,则清空文件内容;如果文件不存在,则创建新文件;

  • “a”:追加模式,写入内容追加到文件末尾;如果文件不存在,则创建新文件;

  • “r+”:读写模式,文件必须存在;

  • “w+”:读写模式,如果文件存在,则清空文件内容;如果文件不存在,则创建新文件;

  • “a+”:读写模式,写入内容追加到文件末尾;如果文件不存在,则创建新文件。

  • 读写文件:使用fprintf()和fscanf()函数进行文件的读写操作。例如,使用fprintf()向文件写入数据:

fprintf(FILE *stream, const char *format, ...);
//使用fscanf()从文件读取数据:
fscanf(FILE *stream, const char *format, ...);
//关闭文件:使用fclose()函数关闭文件,释放资源。
int fclose(FILE *stream);
//关闭文件是一个良好的编程习惯,可以避免资源泄漏问题。

文件常用操作函数

fprintf()函数

1,fprintf()函数是C语言中的一个标准输入输出函数,用于将格式化数据写入到文件中。它的原型如下:

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

参数说明

  • stream:指向文件流的指针,指定要写入的目标文件。

  • format:格式化字符串,类似于printf()中的格式化字符串,指定了要写入的内容的格式。

  • …:可变数量的参数,根据format中的格式化要求,提供相应数量的参数。

类比
fprintf()函数的工作方式与printf()类似,但fprintf()将输出结果写入到指定的文件流中,而不是标准输出设备(如屏幕)。它可以用来向文件中写入各种类型的数据,包括字符串、整数、浮点数等。

使用fprintf()函数时,需要注意以下几点:

1,必须先打开文件并创建文件流才能使用fprintf()来写入数据。

2,需要在结束操作后关闭文件流,以确保数据被正确写入文件。

3,格式化字符串中的格式化规范要与提供的参数类型相匹配,否则可能导致不可预料的结果。
示例代码:

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w"); // 打开一个文件用于写入
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    int num = 42;
    float pi = 3.14159;
    char str[] = "Hello, World!";

    // 将数据写入文件
    fprintf(file, "整数:%d\n", num);
    fprintf(file, "浮点数:%f\n", pi);
    fprintf(file, "字符串:%s\n", str);

    fclose(file); // 关闭文件

    return 0;
}

fscanf()函数

2,fscanf()函数是C语言中的一个标准输入函数,用于从文件中读取格式化数据。它的原型如下:

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

参数说明

  • stream:指向文件流的指针,指定要读取数据的源文件。
  • format:格式化字符串,类似于scanf()中的格式化字符串,指定了要读取的内容的格式。
  • …:可变数量的参数,根据format中的格式化要求,提供相应数量的指针变量,用于存储读取到的数据。

类比
fscanf()函数的工作方式与scanf()类似,但fscanf()从指定的文件流中读取输入数据,而不是从标准输入设备(如键盘)。它可以用来从文件中读取各种类型的数据,包括整数、浮点数、字符串等。

使用fscanf()函数时,需要注意以下几点:

1,必须先打开文件并创建文件流才能使用fscanf()来读取数据。

2,需要在结束操作后关闭文件流,以确保数据被正确读取。

3,格式化字符串中的格式化规范要与读取的数据类型相匹配,否则可能导致读取错误或未定义行为。

示例代码:

#include <stdio.h>

int main() {
    FILE *file = fopen("input.txt", "r"); // 打开一个文件用于读取
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    int num;
    float pi;
    char str[50];

    // 从文件中读取数据
    fscanf(file, "%d", &num);
    fscanf(file, "%f", &pi);
    fscanf(file, "%s", str);

    printf("整数:%d\n", num);
    printf("浮点数:%f\n", pi);
    printf("字符串:%s\n", str);

    fclose(file); // 关闭文件

    return 0;
}

fgets()函数

3,fgets()函数是C语言中的一个标准库函数,用于从文件流中读取一行数据。它的原型如下:

char *fgets(char *str, int n, FILE *stream);

参数说明

  • str:指向字符数组的指针,用于存储读取到的字符串数据。
  • n:要读取的最大字符数(包括字符串结尾的空字符)。
  • stream:指向文件流的指针,指定要读取数据的源文件。

结束标志

fgets()函数用于从指定的文件流中读取数据,直到遇到换行符(\n)、文件结束符或者读取了n-1个字符为止。它会将读取到的数据存储在指定的字符数组中,并在读取完整行后添加一个空字符来表示字符串的结束。

使用fgets()函数时需要注意以下几点

1,读取的数据会包含换行符\n,除非达到文件末尾。

2,如果成功读取到数据,则fgets()函数会返回第一个参数str的值,如果到达文件末尾或者发生错误,则返回NULL。

3,如果读取的行数据长度超过n-1个字符,fgets()函数会截断多余的部分并在末尾加上空字符。

4,读取到的数据可能不包含换行符,因为fgets()会读取换行符并将其替换为字符串结束符。

示例代码:

#include <stdio.h>

int main() {
    FILE *file = fopen("input.txt", "r"); // 打开一个文件用于读取
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    char buffer[100];

    // 从文件中读取一行数据
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer); // 输出读取到的行数据
    }

    fclose(file); // 关闭文件

    return 0;
}

fputc()函数

4,fputc()函数是C语言中的标准库函数,用于将一个字符写入到指定的文件流中。它的原型如下:

int fputc(int character, FILE *stream);

参数说明

  • character:要写入的字符,通常是一个ASCII码值。
  • stream:指向文件流的指针,指定要写入数据的目标文件。
  • fputc()函数会将指定的字符写入到指定的文件流中,并返回写入的字符(以无符号字符形式)。如果写入成功,则返回写入的字符;如果发生错误,则返回EOF。

使用fputc()函数时需要注意以下几点

1,fputc()函数向文件写入一个字符,如果文件不存在将会新建,如果文件已存在则会覆盖原有内容。

2,如果想连续写入多个字符,可以通过多次调用fputc()函数来实现。
3,写入字符时,会按照ASCII码值写入到文件中。

4,在写入成功后,文件流的位置会自动向前移动一个字符位置。
示例代码:

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w"); // 打开一个文件用于写入
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    char ch = 'A';

    // 将字符写入文件
    if (fputc(ch, file) != EOF) {
        printf("字符'%c'写入成功\n", ch);
    } else {
        printf("写入失败\n");
    }

    fclose(file); // 关闭文件

    return 0;
}

fgetc()函数

5,fgetc()函数是C语言中的标准库函数,用于从文件流中读取一个字符。它的原型如下:

int fgetc(FILE *stream);

参数说明

  • stream:指向文件流的指针,指定要从中读取数据的源文件。

    fgetc()函数会从指定的文件流中读取一个字符,并返回读取到的字符(以无符号字符形式)。如果读取成功,则返回读取到的字符;如果已到达文件末尾或者发生错误,则返回EOF。

使用fgetc()函数时需要注意以下几点

1,fgetc()函数每次只能读取一个字符,如果想连续读取多个字符,可以通过多次调用fgetc()函数来实现。
2,每次调用fgetc()函数,文件流的位置会自动向后移动一个字符位置。
3,如果文件流已经到达文件末尾(EOF),则fgetc()函数返回EOF。
4,读取的字符是无符号字符,即在0-255的范围内,EOF的值通常为-1。
示例代码:

#include <stdio.h>

int main() {
    FILE *file = fopen("input.txt", "r"); // 打开一个文件用于读取
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    int ch;

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

    fclose(file); // 关闭文件

    return 0;
}

feek()函数

6,fseek()函数是C语言中用于设置文件位置指针的函数,它允许我们在文件中移动文件位置指针的位置。fseek()函数的原型如下:

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

参数说明

  • stream:指向文件流的指针,指定要进行定位的文件。

  • offset:偏移量,指定了从起始点(由origin参数确定)开始的偏移量。

  • origin:指定起始点,可以是SEEK_SET、SEEK_CUR或+ SEEK_END,分别表示从文件开头、当前位置或文件末尾开始计算偏移量。

    fseek()函数用于将文件流的位置指针设置到指定的位置。通过调用该函数,可以在文件中进行随机访问,而不仅仅是按顺序读取或写入数据。

示例代码:

#include <stdio.h>

int main() {
    FILE *file = fopen("data.txt", "r"); // 打开文件用于读取
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

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

    // 获取当前文件位置指针的位置(即文件末尾的偏移量)
    long fileSize = ftell(file);
    printf("文件大小:%ld 字节\n", fileSize);

    fclose(file); // 关闭文件

    return 0;
}

frewind()函数

7,frewind()函数是C语言中用于将文件位置指针重新定位到文件的起始位置的函数。它的原型如下:

void rewind(FILE *stream);

参数说明

  • stream:指向文件流的指针,指定要重新定位的文件。

    frewind()函数会将文件位置指针重新设置到文件的起始位置,即相当于调用fseek(stream, 0L, SEEK_SET)来实现。

示例代码:

#include <stdio.h>

int main() {
    FILE *file = fopen("data.txt", "r"); // 打开文件用于读取
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

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

    // 从文件中读取数据,并进行处理...

    fclose(file); // 关闭文件

    return 0;
}

⽂件缓冲区

1,ANSIC标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。

2,从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。

3,如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值