十五、字符串函数补充和文件操作

文章目录

      • 字符串函数补充和文件操作
        • 1. 字符串函数补充(strtok)
        • 2. 文件操作 IO
          • 2.1 IO 概述
          • 2.2 fopen 打开文件操作
          • 2.3 fclose 关闭文件操作
          • 2.4 fgetc fputc 和 fputs

字符串函数补充和文件操作

1. 字符串函数补充(strtok)

函数声明

/*
@param str -- 要被分隔成一组小字符串的字符串
@param delim -- 包含分隔符的 C 字符串
@return 函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针
*/
char *strtok(char *str, const *delim)

案例展示

#include <string.h>
#include <stdio.h>

int main()
{
    char str[80] = "This is - www.runoob.com - website";
    char *token;

    /* 获取第一个子字符串 */
    token = strtok(str, "-");

    /*
    继续获取其他的子字符串
    */
    while (token != NULL)
    {
        printf("%s
", token);

        /*
        会继续从上一次分隔的位置继续往后查找并分割字符串,
        因此 token 的值会被更新为下一个子字符串的地址。
        */
        token = strtok(NULL, "-");
    }

    return 0;
}

最终输出结果:

This is 
 www.runoob.com 
 website
2. 文件操作 IO

C 程序员如何创建、打开、关闭文件文本或二进制文件。一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层 (os) 调用来处理存储设备上的文件。

2.1 IO 概述
I ==> Input 输入
O ==> Output 输出
【输入输出 IO 操作参照物是当前程序运行使用的内存】
	内存数据流出到外部 ==> 输出 write put
	外部数据流入到内存 ==> 输入 read get
	
基于冯·诺伊曼计算机理论
	1. 二进制程序思想
	2. 万物皆文件思想,采用 IO 操作对应内容,无论是软件还是硬件
2.2 fopen 打开文件操作
FILE *fopen(const char *filename, const char *mode );
/*
filename 提供当前函数对应文件路径,路径可以是绝对路径 or 相对路径
mode 模式,选择当前文件的打开模式
*/
模式 描述
r 打开一个已有的文本文件,允许读取文件
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里您的程序会从文件的开头写入文件。如果文件不存在,则该会被截断为零长度,重新写入。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件中追加内容。
r+ 打开一个文本文件,允许读写文件
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,入股文件不存在,则会创建一个新文件
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式

如果处理的是二进制文件,则需要使用下面的访问模式来取代上面的访问模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

补充说明,区分二进制的方式是可以利用记事本打开对应文件,如果文件时可视化文本文件,就是普通文本文件,如果是乱码,就是二进制文件。平时的图片,视频,音频,可执行文本,都是二进制文本。

2.3 fclose 关闭文件操作
int fclose(FILE *fp);
/*
需要提供给当前函数都是文件指针 FILE * ,如果文件关闭成功,返回 0,失败返回 EOF(-1)
【注意】
	文件打开之后必须关闭!
*/
2.4 fgetc fputc 和 fputs

针对于字符操作

int fputc(int c, FILE *fp);
/*
写入字符数据到文件中,需要提供给函数的参数是 int 类型字符数据,对于代码而言虽然提供的数据为 int 类型,但实际上写入到文件的内容是字符数据,int 类型数据有且只有【低 8 位】有效写入到文件中,第二个参数是文件指针,要求当前文件指针具备【写入能力】
	模式权限: w a r+ w+ a+
*/

int fgetc(FILE * fp);
/*
从文件中读取一个字节数据,返回值类型为 int 类型,但实际上有效数据是 int 类型内存的【低 8 位】,在读取的过程中,【读取指针会自动后移】完成整个文件的读取操作
	如果文件操作到末尾返回 EOF(-1) End of file
*/

int fputs( const char *s, FILE *fp );
/*
函数 fputs() 把字符串 s 写入到 fp 所指向的输出流中。
如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。
*/

案例展示1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    // 1. 确定文件路径
    char *filename = "./1.txt";

    /*
    2. fopen 打开文件, mode 选择 w w+ a a+
        w 和 w+ 都是清空文件内容写入数据操作
        如果文件不存在,可以创建文件
        a 和 a+ 是当前文件的末尾写入数据操作
        如果文件不存在,可以创建文件
    */
    FILE *fp = fopen(filename, "w");

    // 3. 利用 fputc 写入数据文件中
    fputc('A', fp);
    fputc('B', fp);
    fputc('C', fp);
    fputc('D', fp);

    // 3. 关闭文件
    fclose(fp);
    return 0;
}

展示结果

在这里插入图片描述

案例展示2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    // 1. 确定读取文件的路径
    char *filename = "./1.txt";
    // 定义一个新的文件路径
    char *new_filename = "./2.txt";

    // 2. 通过 fopen 打开文件,mode 选择 r r+ w+ a+
    // r : 允许读取
    FILE *fp = fopen(filename, "r");
    // a : 以追加模式写入文件
    FILE *fp2 = fopen(new_filename, "a");

    // 3. 通过 fgetc 读取数据
    int content = -1;
    // 读取文件 1.txt 时会读取四次
    while ((content = fgetc(fp)) != EOF)
    {
        printf("%c
", content);
        // 循环四次,2.txt 会循环四次,写入四次 'A'
        fputc('A', fp2);
    }
    
    // 4. 关闭文件
    fclose(fp);
    fclose(fp2);

    return 0;
}

在这里插入图片描述