文章目录
-
-
- 字符串函数补充和文件操作
-
- 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; }