链表删除
- void deleteNodeList(Node *head, Node *find){
- while(head->next != find){
- head = head->next;
- }
- head->next = find->next;
- free(find);
- }
-
作业
-
- void bubbleSort(Node *head){
-
- int len = listLength(head);
-
- Node *cur = NULL;
-
- for(int i = 0; i < len - 1; i++){
- cur = head->next;
- for(int j = 0; j < len - 1 - i; j++){
- printf("%i, %i\n", cur->data, cur->next->data);
- if((cur->data) > (cur->next->data)){
- int temp = cur->data;
- cur->data = cur->next->data;
- cur->next->data = temp;
- }
- cur = cur->next;
- }
- }
- }
-
-
- void sortList(Node *head){
-
- int len = listLength(head);
-
- Node *sh, *pre, *cur;
- for(int i = 0; i < len - 1; i ++){
- sh = head;
- pre = sh->next;
- cur = pre->next;
- for(int j = 0; j < len - 1 - i; j++){
- if(pre->data > cur->data){
-
- sh->next = cur;
- pre->next = cur->next;
- cur->next = pre;
-
- Node *temp = pre;
- pre = cur;
- cur = temp;
- }
-
- sh = sh->next;
- pre = pre->next;
- cur = cur->next;
- }
- }
- }
-
-
- void reverseList(Node *head){
-
- Node *pre, *cur;
- pre = head->next;
- head->next = NULL;
-
- while(pre){
- cur = pre->next;
- pre->next = head->next;
- head->next = pre;
-
- pre = cur;
- }
- }
-
文件基本概念
- 文件流:
C 语言把文件看作是一个字符的序列,即文件是由一个一个字符组成的字符流,因此 c 语言将文件也称之为文件流。
- 文件分类
- 文本文件
- 以 ASCII 码格式存放,一个字节存放一个字符。文本文件的每一个字节存放一个 ASCII 码,代表一个字符。这便于对字符的逐个处理,但占用存储空间 较多,而且要花费时间转换。
- .c文件就是以文本文件形式存放的
- 二进制文件
- 以补码格式存放。二进制文件是把数据以二进制数的格式存放在文件中的,其占用存储空间较少。数据按其内存中的存储形式原样存放
- .exe文件就是以二进制文件形式存放的
- 下列代码暂时不要求看懂, 主要理解什么是文本文件什么是二进制文件
- #include <stdio.h>
-
- int main()
- {
-
-
- int num = 666;
- FILE *fa = fopen("ascii.txt", "w");
- fprintf(fa, "%d", num);
- fclose(fa);
-
-
-
- FILE *fb = fopen("bin.txt", "w");
- fwrite(&num, 4, 1, fb);
- fclose(fb);
-
- return 0;
- }
-
- 内存示意图

- 通过文本工具打开示意图

- 文本工具默认会按照ASCII码逐个直接解码文件, 由于文本文件存储的就是ASCII码, 所以可以正常解析显示, 由于二进制文件存储的不是ASCII码, 所以解析出来之后是乱码
文件的打开和关闭
- FILE 结构体是对缓冲区和文件读写状态的记录者,所有对文件的操作,都是通过FILE 结构体完成的。
- struct _iobuf {
- char *_ptr;
- int _cnt;
- char *_base;
- int _flag;
- int _file;
- int _charbuf;
- int _bufsiz;
- char *_tmpfname;
- };
- typedef struct _iobuf FILE;
-
函数声明 |
FILE * fopen ( const char * filename, const char * mode ); |
所在文件 |
stdio.h |
函数功能 |
以 mode 的方式,打开一个 filename 命名的文件,返回一个指向该文件缓冲的 FILE 结构体指针。 |
|参数及返回解析 |参数| charfilaname :要打开,或是创建文件的路径。| |参数| charmode :打开文件的方式。| |返回值| FILE* 返回指向文件缓冲区的指针,该指针是后序操作文件的句柄。|
mode |
处理方式 |
当文件不存在时 |
当文件存在时 |
向文件输入 |
从文件输出 |
r |
读取 |
出错 |
打开文件 |
不能 |
可以 |
w |
写入 |
建立新文件 |
覆盖原有文件 |
可以 |
不能 |
a |
追加 |
建立新文件 |
在原有文件后追加 |
可以 |
不能 |
r+ |
读取/写入 |
出错 |
打开文件 |
可以 |
可以 |
w+ |
写入/读取 |
建立新文件 |
覆盖原有文件 |
可以 |
可以 |
a+ |
读取/追加 |
建立新文件 |
在原有文件后追加 |
可以 |
可以 |
注意点:
- Windows如果读写的是二进制文件,则还要加 b,比如 rb, r+b 等。unix/linux 不区分文本和二进制文件
函数声明 |
int fclose ( FILE * stream ); |
所在文件 |
stdio.h |
函数功能 |
fclose()用来关闭先前 fopen()打开的文件. |
函数功能 |
此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源 |
参数及返回解析 |
|
参数 |
FILE* stream :指向文件缓冲的指针。 |
返回值 |
int 成功返回 0 ,失败返回 EOF(-1)。 |
- #include <stdio.h>
-
- int main()
- {
- FILE *fp = fopen("test.txt", "w+");
- fclose(fp);
- return 0;
- }
-
--
一次读写一个字符
函数声明 |
int fputc (int ch, FILE * stream ); |
所在文件 |
stdio.h |
函数功能 |
将 ch 字符,写入文件。 |
参数及返回解析 |
|
参数 |
FILE* stream :指向文件缓冲的指针。 |
参数 |
int : 需要写入的字符。 |
返回值 |
int 写入成功,返回写入成功字符,如果失败,返回 EOF。 |
- #include <stdio.h>
-
- int main()
- {
-
- FILE *fp = fopen("test.txt", "w+");
-
-
- for(char ch = 'a'; ch <= 'z'; ch++){
-
- char res = fputc(ch, fp);
- printf("res = %c\n", res);
- }
-
-
- fclose(fp);
- return 0;
- }
-
函数声明 |
int fgetc ( FILE * stream ); |
所在文件 |
stdio.h |
函数功能 |
从文件流中读取一个字符并返回。 |
参数及返回解析 |
|
参数 |
FILE* stream :指向文件缓冲的指针。 |
返回值 |
int 正常,返回读取的字符;读到文件尾或出错时,为 EOF。 |
- #include <stdio.h>
-
- int main()
- {
-
- FILE *fp = fopen("test.txt", "r+");
-
-
- char res = EOF;
- while((res = fgetc(fp)) != EOF){
- printf("res = %c\n", res);
- }
-
-
- fclose(fp);
- return 0;
- }
-
函数声明 |
int feof( FILE * stream ); |
所在文件 |
stdio.h |
函数功能 |
判断文件是否读到文件结尾 |
参数及返回解析 |
|
参数 |
FILE* stream :指向文件缓冲的指针。 |
返回值 |
int 0 未读到文件结尾,非零 读到文件结尾。 |
- #include <stdio.h>
-
- int main()
- {
-
- FILE *fp = fopen("test.txt", "r+");
-
-
- char res = EOF;
-
-
- while((res = fgetc(fp)) && (!feof(fp))){
- printf("res = %c\n", res);
- }
-
-
- fclose(fp);
- return 0;
- }
-
- 注意点:
- feof 这个函数,是去读标志位判断文件是否结束的。
- 而标志位只有读完了才会被修改, 所以如果先判断再读标志位会出现多打一次的的现象
- 所以企业开发中使用feof函数一定要先读后判断, 而不能先判断后读
- #include <stdio.h>
- #include <string.h>
- void encode(char *name, char *newName, int code);
- void decode(char *name, char *newName, int code);
- int main()
- {
- encode("main.c", "encode.c", 666);
- decode("encode.c", "decode.c", 666);
- return 0;
- }
-
- void encode(char *name, char *newName, int code){
- FILE *fw = fopen(newName, "w+");
- FILE *fr = fopen(name, "r+");
- char ch = EOF;
- while((ch = fgetc(fr)) && (!feof(fr))){
- fputc(ch ^ code, fw);
- }
- fclose(fw);
- fclose(fr);
- }
-
- void decode(char *name, char *newName, int code){
- FILE *fw = fopen(newName, "w+");
- FILE *fr = fopen(name, "r+");
- char ch = EOF;
- while((ch = fgetc(fr)) && (!feof(fr))){
- fputc(ch ^ code, fw);
- }
- fclose(fw);
- fclose(fr);
- }
-
一次读写一行字符
- 行是文本编辑器中的概念,文件流中就是一个字符。这个在不同的平台是有差异的。window 平台 '\r\n',linux 平台是'\n'
- windows 平台在写入'\n'是会体现为'\r\n',linux 平台在写入'\n'时会体现为'\n'。windows 平台在读入'\r\n'时,体现为一个字符'\n',linux 平台在读入'\n'时,体现为一个字符'\n'
- linux 读 windows 中的换行,则会多读一个字符,windows 读 linux 中的换行,则没有问题
-
-
- int main()
- {
- FILE *fw = fopen("test.txt", "w+");
- fputc('a', fw);
- fputc('\n', fw);
- fputc('b', fw);
- fclose(fw);
- return 0;
- }
-
函数声明 |
int fputs(char *str,FILE *fp) |
所在文件 |
stdio.h |
函数功能 |
把 str 指向的字符串写入 fp 指向的文件中。 |
参数及返回解析 |
|
参数 |
char * str : 表示指向的字符串的指针。 |
参数 |
FILE *fp : 指向文件流结构的指针。 |
返回值 |
int 正常,返 0;出错返 EOF。 |
- #include <stdio.h>
-
- int main()
- {
- FILE *fw = fopen("test.txt", "w+");
-
- fputs("lnj\n", fw);
- fputs("it666\n", fw);
- fclose(fw);
- return 0;
- }
-
- #include <stdio.h>
-
- int main()
- {
- FILE *fp = fopen("test.txt", "w+");
-
- fputs("lnj\0it666\n", fp);
-
- fclose(fp);
- return 0;
- }
-
函数声明 |
char *fgets(char *str,int length,FILE *fp) |
所在文件 |
stdio.h |
函数功能 |
从 fp 所指向的文件中,至多读 length-1 个字符,送入字符数组 str 中, 如果在读入 length-1 个字符结束前遇\n 或 EOF,读入即结束,字符串读入后在最后加一个‘\0’字符。 |
参数及返回解析 |
|
参数 |
char * str :指向需要读入数据的缓冲区。 |
参数 |
int length :每一次读数字符的字数。 |
参数 |
FILE* fp :文件流指针。 |
返回值 |
char * 正常,返 str 指针;出错或遇到文件结尾 返空指针 NULL。 |
- #include <stdio.h>
-
- int main()
- {
- FILE *fp = fopen("test.txt", "w+");
-
- fputs("it666\n", fp);
-
-
-
- rewind(fp);
- char str[1024];
-
-
- fgets(str, 4, fp);
-
- printf("str = %s", str);
- fclose(fp);
- return 0;
- }
-
- #include <stdio.h>
- int main()
- {
- FILE *fp = fopen("test.txt", "w+");
-
- fputs("lnj\n", fp);
- fputs("it666\n", fp);
-
-
-
- rewind(fp);
- char str[1024];
-
-
-
- fgets(str, 1024, fp);
-
- printf("str = %s", str);
- fclose(fp);
- return 0;
- }
-
- #include <stdio.h>
-
- int main()
- {
- FILE *fp = fopen("test.txt", "w+");
-
- fputs("lnj\n", fp);
- fputs("it666", fp);
-
-
-
- rewind(fp);
- char str[1024];
-
-
- while(fgets(str, 1024, fp)){
- printf("str = %s", str);
- }
- fclose(fp);
- return 0;
- }
-
- 注意点:
- 企业开发中能不用feof函数就不用feof函数
- 如果最后一行,没有行‘\n’的话则少读一行
- #include <stdio.h>
-
- int main()
- {
- FILE *fp = fopen("test.txt", "w+");
-
- fputs("12345678910\n", fp);
- fputs("12345678910\n", fp);
- fputs("12345678910", fp);
-
-
-
- rewind(fp);
- char str[1024];
-
-
- while(fgets(str, 1024, fp) && !feof(fp)){
- printf("str = %s", str);
- }
- fclose(fp);
- return 0;
- }
-
- 作业:
- 利用fgets(str, 5, fp)读取下列文本会读取多少次?