文件中的函数

文件的打开与关闭

文件的打开

fopen()函数文件打开

函数原型

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

函数参数

1.*filename 为文件名

2.*mode 为打开方式(注打开方式表)

文件打开方式
  打开方式                                    含义
         “r”以只读的方式打开文件(文件必须已存在)
        “w”以只写的方式打开文件
        “a”以只追加的方式打开文件
         ”+“与上面的字符组合
          ”t“以文本形式打开(可以省略)
         ”b“以二进制形式打开
函数返回值

文件的相关信息(文件名,当前位置指针,缓冲区状况) 

若打开错误则返回空指针NULL(可以判断是否正确打开)

函数功能

以mode形式打开名为filename的文件

函数应用
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 以写模式打开文件
    FILE *opFile = fopen("test.txt", "w");
    if (opFile == NULL) {
        puts("Couldn't open file");
        exit(0);
    } else {
        fputs("includehelp", opFile);
        puts("Write operation successful");
        fclose(opFile);
    }
    return 0;
}

文件的关闭

fclose()函数关闭

函数原型

int fclose(FILE *fp);

函数参数

*fp 为程序前面获取文件的指针(对于以‘w’方式打开的文件在关闭之前会刷新缓冲区)

函数返回值

正常关闭返回 0;出错时为 非零值

函数功能

关闭 fp 指向文件 

函数应用
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 以读模式打开文件
    FILE *fp = fopen("test.txt", "r");
    if (fp == NULL) {
        perror("Error opening file");
        return 1;
    }

    // 读取文件内容并打印
    char buffer[100];
    while (fgets(buffer, sizeof(buffer), fp)!= NULL) {
        printf("%s", buffer);
    }

    // 关闭文件
    if (fclose(fp)!= 0) {
        perror("Error closing file");
        return 1;
    }

    return 0;
}

文件的读与写

读/写字符函数

1.fgetc()函数

若想将指定文件中的字符读取到程序中,并将字符赋予某个变量可用此函数

函数原型

int fgetc(FILE *fp);

函数参数

*fp 为已打开文件的文件指针

函数返回值

返回在文件中读取到的字符

1. 若返回失败则返回一个文件结束标志EOF,EOF在stdio.h中定义为常量-1,用来表示文件内容的结束,由于文件中字符以其对应的ASCII码形式储存,不包括负数,因此-1来表示内容的结束(而在返回值处也需要使用in型来使EOF的值包含在其中)

2. feof()函数可以判断文件是否结束,若已指向末尾则返回非零值,否则返回0值

3. 当文件未结束时,”feof(fp)“值为0,while循环成立,继续执行循环内部的操作;

    当文件

函数应用
#include <stdio.h>
#include <stdlib.h>

#define MAX_LENGTH 100

int main() {
    FILE *fp;
    char line[MAX_LENGTH];

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

    // 逐行读取文件内容并打印
    while (fgets(line, MAX_LENGTH, fp)!= NULL) {
        printf("%s", line);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

2.fputc() 函数

函数原型

int fputc(int c,FILE *fp);

函数参数

*fp 表示已打开的文件指针;*c 表示需要输出的字符,可以是常量,可以为变量

函数返回值

成功输出为输出值;出错时为EOF

函数功能

把变量C的值写到fp所指向的文件中

函数应用
#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    char str[] = "Hello, World!";
    int i;

    // 以写模式打开文件
    fp = fopen("test.txt", "w");
    if (fp == NULL) {
        perror("无法打开文件");
        return 1;
    }

    // 逐个字符写入文件
    for (i = 0; str[i]!= '\0'; i++) {
        fputc(str[i], fp);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

读/写字符串函数

1. fgets() 函数

函数原型

char *fgets(char *s,int n,FILE *fp);

函数参数

*fp 表示文件指针;n 表示可以存储的字符长度,将读取到的内容存储到字符指针*s中

函数返回值

读取成功返回字符数组首地址;读取失败返回NULL

(从文件中读取到字符串后,程序会自动在末尾添加结束字符‘\0’,实际读取到n-1个字符)

函数功能

从fp 指向的文件中读取长度为n-1的字符串,并存入起始地址为s 的一段连续内存中

fgets()最多只能读取一行数据,不能跨行,如果在读取到n-1个字符只之前出现了换行符'\n',或者读到了文件末尾,则读取结束

函数应用
#include <stdio.h>

int main() {
    FILE *fp;
    char buffer[100];

    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        perror("Error opening file");
        return 1;
    }

    while (fgets(buffer, sizeof(buffer), fp)!= NULL) {
        printf("%s", buffer);
    }

    fclose(fp);
    return 0;
}

2. fputs() 函数

函数原型

int fputs(char *s,FILE *fp);

函数参数

*fp 表示文件指针;*s 表示需要输出的字符串,可以是字符串常量,字符串数组名,字符型指针

函数返回值

若参数成功输出,则返回非负值,否则返回EOF

函数功能

将s 所指向的字符串输出到fp 指向的文件中

函数应用
#include <stdio.h>

int main() {
    FILE *fp;
    char text[] = "这是要写入文件的一行文本。";

    fp = fopen("output.txt", "w");
    if (fp == NULL) {
        perror("Error opening file");
        return 1;
    }

    fputs(text, fp);

    fclose(fp);
    return 0;
}

格式化读/写函数

1. fscanf() 函数

操作对象不是终端而是磁盘文件

函数原型

int fscannf(FILE *fp,char *format,[argument...]);

函数参数

*fp 为文件指针

*format 为格式控制字符串

argument 为输入列表

函数返回值

已输入的数据个数

函数功能

从fp 所指向的文件中按照 format 指定的格式,将数据存放到 argument内存地址中

(通过键盘读取)

函数应用
#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME_LENGTH 50

int main() {
    FILE *fp;
    char name[MAX_NAME_LENGTH];
    int age;
    float score;

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

    // 逐行读取文件并解析学生信息
    while (fscanf(fp, "%s %d %f", name, &age, &score) == 3) {
        printf("姓名:%s,年龄:%d,成绩:%.2f\n", name, age, score);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

2. fprintf() 函数

函数原型

int fprintf(FILE *fp,char *format,[argument...]);

函数参数

*fp 为文件指针

*format 为格式控制字符串

argument 为输出列表

函数返回值

输出的数据个数

函数功能

将argument 变量按照format 格式输出到fp 所指向的文件中

函数应用
#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME_LENGTH 50

int main() {
    FILE *fp;
    char names[3][MAX_NAME_LENGTH] = {"Alice", "Bob", "Charlie"};
    int ages[3] = {20, 21, 22};
    float scores[3] = {85.5, 90.0, 88.0};

    // 以写模式打开文件
    fp = fopen("students.txt", "w");
    if (fp == NULL) {
        perror("无法打开文件");
        return 1;
    }

    // 将学生信息写入文件
    for (int i = 0; i < 3; i++) {
        fprintf(fp, "%s %d %.2f\n", names[i], ages[i], scores[i]);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

读/写数据块函数

1. fread() 函数

将文件中的一串连续的数据一次读取到一个数组中

函数原型

unsigned int fread(void *prt,unsigned int size,unsigned int nmemb,FILE *fp);

函数参数

*prt 为一个指针,是数据的存放地址

size 是要读取每个数据块的字节数

nmemb 为要读取多少个size 大小的数据项

*fp 为文件指针

函数返回值

所读数据项个数,通常与nmemb 相等,若出现错误或到达文件末尾,则可能小于nmemb

函数功能

从fp 所指向的文件中读取nmemb 个长度为size 的数据项,并存入ptr 所指向的内存中

函数应用
#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME_LENGTH 50

int main() {
    FILE *fp;
    char names[3][MAX_NAME_LENGTH] = {"Alice", "Bob", "Charlie"};
    int ages[3] = {20, 21, 22};
    float scores[3] = {85.5, 90.0, 88.0};

    // 以写模式打开文件
    fp = fopen("students.txt", "w");
    if (fp == NULL) {
        perror("无法打开文件");
        return 1;
    }

    // 将学生信息写入文件
    for (int i = 0; i < 3; i++) {
        fprintf(fp, "%s %d %.2f\n", names[i], ages[i], scores[i]);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

2. fwrite()函数

把内存中连续的一串数据输出到文件

函数原型

unsigned int fwrite(void *prt,unsigned int size,unsigned int nmemb,FILE *fp);

函数参数

*fp 为一个指针,是要输出数据的首地址;

size 是输出每个数据块的字节数

nmemb 为要写入多少个size 大小的数据项

*fp 为指针文件

函数返回值

写入文件的数据项个数

函数功能

将prt 所指向的连续nmemb 个size 大小的数据输出到fp  所指向的文件中

一般使用于二进制文件的读写,尤其是数组

函数应用
 #include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    char str[] = "Hello, World!\n";

    // 以写模式打开文件
    fp = fopen("test.txt", "w");
    if (fp == NULL) {
        perror("无法打开文件");
        return 1;
    }

    // 将字符串写入文件
    fwrite(str, sizeof(char), sizeof(str) - 1, fp);

    // 关闭文件
    fclose(fp);

    return 0;
}

文件定位

1. fseek () 函数

随意更改文件的位置指针

函数原型

int fseek(FILE *fp,long int offset,int from);

函数参数

*fp 为文件指针;

offset 为移动的字节数,类型数据为long,用常量表示时要求加数据‘L’ ,偏移量的计算单位为字节,而且可以为负值,表示从当前位置反方向偏移;

from 表示从哪里开始移动,可选择文件首,当前位置,文件尾 3种起始点,其值分别为0,1,2

函数返回值

成功返回当前位置;否则返回-1

函数功能

将fp 指向文件的位置指针按照from 要求移动offset 个字节

函数应用
#include <stdio.h>
#include <stdlib.h>

// 定义学生结构体
typedef struct {
    char name[20];
    int age;
    float score;
} Student;

int main() {
    FILE *fp;
    Student student;
    int targetIndex = 1;  // 要读取的学生索引,从0开始

    // 以二进制读模式打开文件
    fp = fopen("students.bin", "rb");
    if (fp == NULL) {
        perror("无法打开文件");
        return 1;
    }

    // 将文件指针移动到指定学生的位置
    fseek(fp, targetIndex * sizeof(Student), SEEK_SET);

    // 读取学生信息
    fread(&student, sizeof(Student), 1, fp);

    // 输出学生信息
    printf("姓名:%s\n年龄:%d\n成绩:%.2f\n", student.name, student.age, student.score);

    // 关闭文件
    fclose(fp);

    return 0;
}

2. rewind() 函数

将文件的位置指针直接重置到文件的开头位置

函数原型

void rewind(FILE *fp);

函数参数

文件指针

函数返回值

函数功能

设置fp 指向文件的位置指针指向文件的首字节

3. ftell() 函数

得到文件位置指针的读写位置,读写位置指的是从文件首到当前位置的字节数

函数原型

long ftell(FILE *fp);

函数参数

文件指针

函数返回值

类型为长整型,读取成功返回当前文件的位置指针,失败则为-1L

函数功能

获取fp 指向文件当前的位置指针

函数应用
#include <stdio.h>

int main() {
    FILE *fp;
    long size;

    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        perror("Error opening file");
        return 1;
    }

    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fclose(fp);

    printf("文件大小为 %ld 字节\n", size);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值