c语言(四)-文件操作、分文件写法

419 阅读3分钟

本篇文章主要记录c语言中的文件操作,以及c语言的分文件写法。

c语言中的文件操作可以说是非常的简单,api使用起来很方便,感觉比java要简单很多。在c语言中会把设备也当作文件处理,例如屏幕、键盘等。

FILE结构体

文件操作需要引入stdio.h头文件

在c语言中想要操作文件,离不开FILE这个结构体,这个结构体里面会有与文件相关的参数。

typedef struct
{
	short       level;  /* 缓冲区"满"或者"空"的程度 */
	unsigned    flags;  /* 文件状态标志 */
	char        fd;     /* 文件描述符 */
	unsigned    hold;   /* 如无缓冲区不读取字符 */
	short       bsize;  /* 缓冲区的⼤小 */
	unsigned    *buffer; /* 数据缓冲区的位置 */
	unsigned    ar;     /* 指针,当前的指向 */
	unsigned    istemp;  /* 临时⽂文件,指⽰示器 */
	short       token;  /* ⽤用于有效性的检查 */
}FILE;

一般情况下我们不会去读取FILE结构体里面的成员的。

文件操作

文件操作分为固定的几个步骤

  • 打开文件指针

    c语言中有三个默认打开的文件指针stdin、stdout、stderr,分别对应标准输入,标准输出,标准错误输出,这三个文件指针可以直接使用,举个列子,具体api后面介绍

//定义一个字符串
char *str = "hello world";
//将这个字符串输出到stdout所指向的文件,也即标准输出,也就是屏幕
fputs(str, stdout);

打开文件api是fopen

//通过fopen函数来打开一个函数执政
FILE *fp = fopen("./test.txt", "w");
  • 对文件进行读写
//文件的读写主要设计6个函数
fgetc    fputc  单个字符的读写
fgets    fputs  按行来读写
fread    fwirte 按块来读写
fprintf  fscanf 格式化读写

fprintf fscanf 可以与 sprintf sscanf对比来看

  • 关闭文件指针,关闭文件指针的时候就会刷新缓冲区
int main()
{
    //打开文件,如果文件不存在则创建,如果存在,则内容覆盖
    FILE *fp = fopen("./test.txt", "w");
    //操作文件
    fputs("hello world", fp);
    //关闭文件
    fclose(fp);
    fp = NULL;
    return 0;
}

文件读写的时候,都会现将文件读写入缓冲区,只有缓冲区满的时候,才会真正读入内存或写入文件。可以通过fflush函数强制刷新缓冲区。

文件打开方式

文件打开方式主要记录几种常用的

  • r 以读方式打开文件,文件不存在则报错
  • w 以写方式打开文件,文件不存在则创建,文件存在则覆盖
  • r+ w+ 加上+后,就表示可读写,其他特性和不加+一样
  • a 以追加的方式写文件,如果文件不存在则创建

文件操作很简单,基本就这些内容。

分文件写法

c语言有个要求,就是变量、函数都需要先声明,后使用。所以我们一般会把变量、函数的声明单独写在一个文件,我们把这个文件叫做头文件,也就是.h结尾的文件,而把定义、实现写在.c文件中,这样别的文件就可以通过#include指令引入头文件,也就有了变量或函数的声明了。

  • 头文件
#ifndef _SORT_H
#define _SORT_H

/**
 * 冒泡排序
 */
int bubbleSort(int *array, int length);

/**
 * 选择排序
 */
int selectSort(int *array, int length);

#endif //_SORT_H

#ifndef #define #endif 这几个是预处理指令,用途是避免头文件的重复包含,导致死循环,例如a包含b,b又包含a。

  • 实现 在.c结尾的文件中对声明的函数进行实现
int bubbleSort(int *array, int length)
{
    if (array == NULL || length <= 0)
    {
        return -1;
    }
    //中间变量,用于交换
    int temp;
    
    for (int i = 0; i < length - 1; i++)
    {
        for (int j = 0; j < length - 1 - i; j++)
        {
            if (array[j] > array[j + 1])
            {
                temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
    return 0;
}
  • 使用
#include "sort.h"

int main()
{
    //定义数组
    int array[] = {1, 2, 7, 4};
    //计算数组长度
    int length = sizeof(array) / sizeof(array[0]);
    //直接调用函数即可,因为引入了sort.h头文件中的声明了
    bubbleSort(array, length);
    return 0;
}

c语言相关的内容就先记录到这里。