文章目录
字符串函数补充和文件操作
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\n", 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\n", content);
// 循环四次,2.txt 会循环四次,写入四次 'A'
fputc('A', fp2);
}
// 4. 关闭文件
fclose(fp);
fclose(fp2);
return 0;
}