C语言 文件操作

2023-12-13 07:34:04

前言

主要需要看的是概念部分、以及FILE结构体、文件指针部分。其余函数使用,知道其功能存在即可,实际在使用到这些函数时去官方文档查的话,不管是介绍还是示例都更齐全。

文件概念

文件名

完整文件名包含三部分:文件路径+文件名主干+文件后缀

c:\md\test.txt

文件名在同一台主机中是唯一的。

数据文件&程序文件

根据用途划分:

  1. 程序文件
    程序文件是包含计算机程序代码的文件,它包含了一系列指令和命令,用于告诉计算机如何执行特定的任务。程序文件通常以可执行文件(如.exe、.app等)或源代码文件(如.c、.py等)的形式存在。它们可以被计算机加载和执行,从而实现特定的功能或任务。

  2. 数据文件
    数据文件是存储实际数据的文件,它包含了计算机程序需要处理的信息。数据文件可以是文本文件(如.txt、.csv等)或二进制文件(如.jpg、.mp3等),其中包含了具体的数据内容。数据文件可以包含文本、数字、图像、音频、视频等各种类型的数据,这些数据可以被程序文件读取和处理。

文本文件&二进制文件

根据数据储存形式划分

  1. 内存中文件是二进制文件
  2. 文本文件以ASCII字符形式存储
  3. 二进制文件以二进制形式存储

文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。 文件缓冲区存在的意义是同过减少IO次数提高文件操作整体的效率。
在这里插入图片描述

文件操作

FILE结构体

FILE 结构体的定义:

struct _iobuf {
        char *_ptr; // 文件指针
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
       };
typedef struct _iobuf FILE

当使用者打开一个文件的时候,OS就会自动创建该文件的FILE类型变量,通过FILE的定义,可以理解该FILE类型记录了该文件的信息,故用户可以使用FILE类型变量的指针对FILE变量进行操作,从而达到对打开的文件进行操作的目的。例:

FILE* fp =  fopen ( const char * filename, const char * mode ); // 后续用fp指针操作即可

文件指针

文件指针是FILE结构体中的一个属性
文件指针在读取一个字符后会向后移动一位,说明文件指针是可以指向文件信息区的各个部分的,可受使用者通过函数调整位置从而进行不同读取/写入策略的。(和数组的指针相比逻辑差不多,操作方法不一样)

在这里插入图片描述

文件打开&关闭

文件打开后必须关闭,否则会造成系统资源浪费。

//打开文件函数
FILE * fopen ( const char * filename, const char * mode );
//关闭文件函数
int fclose ( FILE * stream )

FILE * fopen ( const char * filename, const char * mode ) mode参数 模式 :

“r”  (只读) 为了输入数据,打开一个已经存在的文本文件
“w”  (只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”  (追加) 向文本文件尾添加数据 建立一个新的文件
“rb” (只读) 为了输入数据,打开一个二进制文件 出错
“wb” (只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab” (追加) 向一个二进制文件尾添加数据 出错
“r+” (读写) 为了读和写,打开一个文本文件 出错
“w+” (读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+” (读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

文件输入/输出

字符输入函数    fgetc   所有输入流
字符输出函数    fputc   所有输出流
文本行输入函数  fgets   所有输入流
文本行输出函数  fputs   所有输出流
格式化输入函数  fscanf  所有输入流
格式化输出函数  fprintf 所有输出流
二进制输入      fread   文件
二进制输出      fwrite  文件`

例:

#include <stdio.h>

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

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

    fclose(file);  // 关闭文件
    return 0;
}

文件指针控制

(文件随机读写)

fseek

功能:根据文件指针的位置和偏移量来定位文件指针。
函数原型为:

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

参数说明:
stream:指定要设置位置的文件指针。
offset:设置的偏移量,即要移动的字节数。
origin:设置基准位置,可以取以下值:
SEEK_SET:从文件开头开始计算偏移量。
SEEK_CUR:从当前位置开始计算偏移量。
SEEK_END:从文件末尾开始计算偏移量。
返回值:
如果成功设置文件指针的位置,则返回0;
如果发生错误,则返回非零值。
使用示例:

#include <stdio.h>

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

    fseek(file, 5, SEEK_SET);  // 设置文件指针位置为从文件开头偏移5个字节

    int ch;
    while ((ch = fgetc(file)) != EOF) {  // 从当前位置开始读取文件内容
        printf("%c", ch);
    }

    fclose(file);  // 关闭文件

    return 0;
}

ftell
**功能:**返回文件指针相对于起始位置的偏移量

long int ftell(FILE *stream);

参数说明:
stream:指定要获取位置的文件指针。
返回值:
如果成功获取文件指针的当前位置,则返回当前位置相对于文件开头的偏移量(以字节为单位);
如果发生错误,则返回-1。

rewind
功能:
让文件指针的位置回到文件的起始位置
函数原型为

void rewind(FILE *stream);

参数说明
stream:指定要重新设置位置的文件指针。
返回值:无。

文章来源:https://blog.csdn.net/WSK1454360679/article/details/134888053
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。