C语言范例学习06-上
第六章 文件操作
前言:第五章是C语言在数学上的一些应用,我觉得没有必要,便跳过了。这章正如我标题所写的,是C语言在文件上的操作。学习了这个后,你们可以自行编辑一些所需的快捷程序,来实现一些既定的目的,完成一些重复操作。
PS:本文中例子皆采用了相对路径,请注意路径问题。
6.1 文件读写操作
PS:首先确立一个概念,C语言中的“文件”只是一个逻辑概念,可以用来表示从磁盘文件到终端等所有东西,就如同DOS一样的。在这一节中,我们要先学会对磁盘文件进行打开或读写操作的几种不同方法,然后就可以根据不同情况来选择最为恰当的操作方式。
实例167 读取磁盘文件
问题:编程实现读取某一相对下文本文档内容。(事先放入一个文本内容为“hello world hello master”。)
逻辑:该实例利用到了一些与文件操作相关的函数。
- fopen 文件的打开函数:
FILE *fp
fp=fopen(文件名,使用文件方式)
例如:fp=fopen("123","r");
它表示要打开名称为123的文本文档,使用文件打开方式为“只读”,fopen函数带回指向123.txt文件的指针并赋给fp,也就是FILE类型指针fp指向123.txt文件。
PS:使用文件方式:
“r” (只读):打开一个文本文件,只允许读数据。
“w” (只写):打开或建立一个文本文件,只允许写数据。
“a” (追加):打开一个文本文件,并在文件末尾写数据。
“rb” (只读):打开一个二进制文件,只允许读数据。
“wb” (只写):打开或建立一个二进制文件,只允许写数据。
“ab” (追加):打开一个二进制文件,并在文件末尾写数据。
“r+” (读写):打开一个文本文件,允许读和写。
“w+” (读写):打开或建立一个文本文件,允许读写。
“a+” (读写):打开一个文本文件,允许读,或在文件末尾追加数据。
“rb+” (读写):打开一个二进制文件,允许读和写。
“wb+” (读写):打开或建立一个二进制文件,允许读和写。
“ab+” (读写):打开一个二进制文件,允许读,火灾文件末尾追加数据。
- fclose 文件的关闭函数:
fclose(文件指针)
作用是通过文件指针将该文件关闭。
- fgetc函数:
ch=fgetc(fp)
该函数作用是从指定的文件(fp指向的文件)读入一个字符赋给ch。注意该文件必须是以读或读写方式打开。
其实,说到这里,大家基本就有了问题的思路了。通过fopen函数打开目标文件,将其内存地址赋给fp。再利用循环结构。通过fgetc函数将文件内字符依次赋给ch,显示在屏幕上。最后通过fclose函数关闭文件。
代码:
#include <stdio.h>
main()
{
FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/
char ch, filename[]; /*定义变量及数组为字符型*/
printf("please input file`s name;\n");
gets(filename); /*输入文件所在路径及名称*/
fp = fopen(filename, "r"); /*以只读方式打开指定文件*/
ch = fgetc(fp); /*fgetc函数带回一个字符赋给ch*/
while (ch != EOF) /*当读入的字符值等于EOF时结束循环*/
{
putchar(ch); /*将读入的字符输出在屏幕上*/
ch = fgetc(fp); /*fgetc函数继续带回一个字符赋给ch*/
}
fclose(fp); /*关闭文件*/
}
注意:EOF表示End Of File,文件读取结束。其值通常为-1,也常在其他函数中表达调用失败的意思。EOF只能用于文本文件。
反思:其实一开始接触C语言的文件操作会有一些不理解。但是如果有一定汇编或者Win32基础,就会觉得很好理解它的行为了。原本的文件存放于硬盘内存中,利用fopen函数打开它,就是将其展开到内存空间中,并将其内存地址首地址赋给了fopen函数,即fopen函数的返回值。接下来的行为就和正常C语言中指针读取数组内容相似了。最后,通过fclose函数关闭该文件,即将该文件从内存空间中释放。
实例168 将数据写入磁盘文件
问题:编程实现向任意路径下新建一个文本文档,想该文档中写入you are the best one!,以“#”结束字符串的输入。
逻辑:本实例又用到了一个新的函数。
- fputc函数:
ch=fputc(ch,fp)
该函数作用是将一个字符ch写到fp指向的文件内。
PS:fputc函数的返回值在成功时,为输入的字符,失败时,为EOF。
代码:
#include <stdio.h>
main()
{
FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/
char ch, filename[]; /*定义变量及数组为字符型*/
printf("please input filename:\n");
scanf("%s", filename); /*输入文件所在路径及名称*/
if ((fp = fopen(filename, "w")) == NULL) /*以只写方式打开指定文件*/
{
printf("cannot open file\n");
exit();
}
ch = getchar(); /*fgetc函数带回一个字符赋给ch*/
while (ch != '#') /*当输入"#"时结束循环*/
{
fputc(ch, fp); /*将读入的字符写到磁盘文件上去*/
ch = getchar(); /*fgetc函数继续带回一个字符赋给ch*/
}
fclose(fp); /*关闭文件*/
}
注意:代码行.8中条件判断条件“(fp = fopen(filename, "w")) == NULL)”的使用,细细理解。
反思:同样利用汇编基础可以很好理解,不再赘述。
实例169: 格式化读写文件
问题:编程实现将输入的小写字母串写入磁盘文件,再将刚写入磁盘文件的内容读出并以大写字母的形式显示在屏幕上。
逻辑:同样,这次实例又有一些新的函数。
- fprintf函数:
ch=fprintf(文件指针,格式字符串,输出列表)
例如:fprintf(fp,"%d",i);
它表示将整型变量i的值按%d的格式输出到fp指向的文件上。
- fscanf函数:
fscanf(文件指针,格式字符串,输入列表)
例如:fscanf(fp,"%d",&i);
它表示以%d的格式读入fp所指向的文件上i的值。
代码:
#include <stdio.h>
main()
{
int i, flag = ; /*定义变量为基本整型*/
char str[], filename[]; /*定义数组为字符型*/
FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/
printf("please input filename:\n");
scanf("%s", filename); /*输入文件所在路径及名称*/
if ((fp = fopen(filename, "w")) == NULL) /*以只写方式打开指定文件*/
{
printf("cannot open!");
exit();
}
while (flag == )
{
printf("\nInput string:\n");
scanf("%s", str); /*输入字符串*/
fprintf(fp, "%s", str); /*将str字符串内容以%s形式写到fp所指文件上*/
printf("\nContinue:?(Y/N)");
if ((getchar() == 'N') || (getchar() == 'n')) /*输入n结束输入*/
flag = ; /*标志位置0*/
}
fclose(fp); /*关闭文件*/
fp = fopen(filename, "r"); /*以只写读方式打开指定文件*/
while (fscanf(fp, "%s", str) != EOF) /*从fp所指的文件中以%s形式读入字符串*/
{
for (i = ; str[i] != '\0'; i++)
if ((str[i] >= 'a') && (str[i] <= 'z'))
str[i] -= ; /*将小写字母转换为小写字母*/
printf("\n%s\n", str); /*输出转换后的字符串*/
}
fclose(fp); /*关闭文件*/
}
注意:代码行.12中“exit(0)”一点运行,就直接退出程序。其表示正常退出。另外,exit(1)表示异常退出,即程序出现不该出现的异常。windows中可以通过GetExitCodeProcess函数来获取退出代码。
反思:这个实例只能说是前两个实例的小小综合,再加上str的应用。大小写字母转换这种老问题,就不提了。
实例170 成块读写操作
问题:编程实现学生成绩信息统计,从键盘中输入学生成绩信息,保存到指定磁盘文件中,输入完全部信息后将磁盘文件中保存的信息输出到屏幕上。
逻辑:老惯例,再来几个新函数。
- fwrite函数:
fwrite(buffer ,size,count,fp)
它的作用是将buffer地址开始的信息,输入count次,每次写size字节到fp所指定的文件中。
- fread函数:
fread(buffer,size,count,fp)
它的作用是从fp所指向的文件中读入count次,每次读size字节,读入的信息存在buffer地址中。
注意这两个函数形参即其代表的意思,毕竟参数还是蛮多的。
代码:
#include <stdio.h>
struct student_score /*定义结构体存储学生成绩信息*/
{
char name[];
int num;
int China;
int Math;
int English;
} score[];
void save(char *name, int n) /*自定义函数save,用于将数据存储起来*/
{
FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/
int i;
if ((fp = fopen(name, "wb")) == NULL) /*以只写方式打开指定文件*/
{
printf("cannot open file\n");
exit();
}
for (i = ; i < n; i++)
if (fwrite(&score[i], sizeof(struct student_score), , fp) != ) /*将一组数据输出到fp所指的文件中*/
printf("file write error\n"); /*如果写入文件不成功,则输出错误*/
fclose(fp); /*关闭文件*/
}
void show(char *name, int n) /*自定义函数show,用于将数据展现到显示屏上*/
{
int i;
FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/
if ((fp = fopen(name, "rb")) == NULL) /*以只读方式打开指定文件*/
{
printf("cannot open file\n");
exit();
} for (i = ; i < n; i++)
{
fread(&score[i], sizeof(struct student_score), , fp); /*从fp所指向的文件读入数据存到数组score中*/
printf("%-10s%4d%4d%4d%4d\n", score[i].name, score[i].num,
score[i].China, score[i].Math, score[i].English);
}
fclose(fp); /*以只写方式打开指定文件*/
}
main()
{
int i, n; /*变量类型为基本整型*/
char filename[]; /*数组为字符型*/
printf("how many students in your class?\n");
scanf("%d", &n); /*输入学生数*/
printf("please input filename:\n");
scanf("%s", filename); /*输入文件所在路径及名称*/
printf("please input name,number,China,math,English:\n");
for (i = ; i < n; i++) /*输入学生成绩信息*/
{
printf("NO%d", i + );
scanf("%s%d%d%d%d", score[i].name, &score[i].num, &score[i].China,
&score[i].Math, &score[i].English);
save(filename, n); /*调用函数save*/
} show(filename, n); /*调用函数show*/
}
注意:代码行.35中“%-10s%4d%4d%4d%4d\n”,希望还记得printf函数输出格式的设置。代码行.35-36,如果看不懂,请将代码分解开来,这句代码只是一个小小的综合应用。
实例171 随机读写文件
问题:输入若干个学生信息,保存到指定磁盘文件中,要求将奇数条学生信息从磁盘中读入并显示在屏幕上。
逻辑:再介绍一个函数。
- fseek函数:
fseek(文件类型指针,位移量,起始点)
它的作用是用来移动文件内部位置指针,其中参数“起始点”表示从何处开始计算位移量。规定的起始点有3种:文件首、文件当前位置和文件尾。
PS:起始点表示法:
“起始点” “表示符号” “数字表示”
“文件开头” “SEEK-SET” “0”
“当前位置” “SEEK-CUR” “1”
“文件末尾” “SEEK-END” “2”
例如:fseek(fp,-20L,1);
它表示将位置指针从当前位置,向后退20字节。(注意后退的意思。)
代码:
#include <stdio.h>
struct student_type /*定义结构体存储学生信息*/
{
char name[];
int num;
int age;
}stud[];
void save(char *name, int n) /*自定义函数save*/
{
FILE *fp;
int i;
if ((fp = fopen(name, "wb")) == NULL) /*以只写方式打开指定文件*/
{
printf("cannot open file\n");
exit();
}
for (i = ; i < n; i++)
if (fwrite(&stud[i], sizeof(struct student_type), , fp) != ) /*将一组数据输出到fp所指的文件中*/
printf("file write error\n"); /*如果写入文件不成功,则输出错误*/
fclose(fp); /*关闭文件*/
}
main()
{
int i, n; /*变量类型为基本整型*/
FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/
char filename[]; /*数组为字符型*/
printf("please input filename:\n");
scanf("%s", filename); /*输入文件所在路径及名称*/
printf("please input the number of students:\n");
scanf("%d", &n); /*输入学生数*/
printf("please input name,number,age:\n");
for (i = ; i < n; i++) /*输入学生信息*/
{
printf("NO.%d", i + );
scanf("%s%d%d", stud[i].name, &stud[i].num, &stud[i].age);
save(filename, n); /*调用函数save*/
} if ((fp = fopen(filename, "rb")) == NULL) /*以只读方式打开指定文件*/
{
printf("can not open file\n");
exit();
}
for (i = ; i < n; i += )
{
fseek(fp, i *sizeof(struct student_type), ); /*随着i的变化从文件开始处随机读文件*/
fread(&stud[i], sizeof(struct student_type), , fp); /*从fp所指向的文件读入数据存到数组stud中*/
printf("%-10s%5d%5d\n", stud[i].name, stud[i].num, stud[i].age);
}
fclose(fp); /*关闭文件*/
}
反思:这里利用了一个调用函数,一个结构体。如果没有忘记这些概念,便不存在理解问题了。
实例172 以行为单位读写文件
问题:从键盘中输入字符串“hello world hello boy”,利用fputs函数见字符串内容输出到磁盘文件中,使用fgets函数从磁盘文件中读取字符串到数组s中,最终将其输出到屏幕上。
逻辑:这里又增添两个函数。
- fputs函数:
fputs(字符串,文件指针)
它的作用是想指定的文件写入一个字符串,其中字符串可以是字符串常量,也可以是字符串数组名、指针或者变量。
- fgets函数:
fgets(字符数组名,n,文件指针)
它的作用从指定的文件中读入一个字符串到字符数组中。n表示所得到的字符串中字符的个数(包含字符串结束符“\0”(表示NULL))。
代码:
#include <stdio.h>
main()
{
FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/
char str[], s[], filename[]; /*定义数组为字符型*/
printf("please input string!\n");
gets(str); /*获得字符串*/
printf("please input filename:\n");
scanf("%s", filename); /*输入文件所在路径及名称*/
if ((fp = fopen(filename, "wb")) != NULL)
/*以只写方式打开指定文件*/
{
fputs(str, fp); /*把字符数组str中的字符串输出到fp指向的文件*/
fclose(fp);
}
else
{
printf("cannot open!");
exit();
}
if ((fp = fopen(filename, "rb")) != NULL)
{
while (fgets(s, sizeof(s), fp))
/*从fp所指的文件中读入字符串存入s中*/
printf("%s", s);
/*将字符串输出*/ fclose(fp); /*关闭文件*/
}
反思:区分fgetc、fgets、fputc、fputs的区别。看待这些问题时应当不断更换着自己观察的角度。比如fprintf是将内容显示到屏幕上,其实fprintf只是C语言内的一个来自stdio库函数的封装函数,来实现C的文件对屏幕的输入(代码自行查找)。而那些库函数中的函数也都是通过调用Windows中API函数来实现其功能的。再往底层探去,Windows的API函数也是C语言。其下方的抽象层却由汇编构成。是不是很神奇。
6.2 文件内容操作
实例173 复制文内容到另一个文件
问题:编程实现将一个已存在的文本文档的内容复制到新建的文本文档中。
逻辑:其实前面我们已经实现了从文件到屏幕,从屏幕到文件的操作,那么将两者综合一下,就是这次实例的结果。要注意,读取时,两个文件都应该处在打开的状态。应该在结束时一起关闭。
代码:
#include <stdio.h>
main()
{
FILE *in,*out; /*定义两个指向FILE类型结构体的指针变量*/
char ch, infile[], outfile[]; /*定义数组及变量为基本整型*/
printf("Enter the infile name:\n");
scanf("%s", infile); /*输入将要被复制的文件所在路径及名称*/
printf("Enter the outfile name:\n");
scanf("%s", outfile); /*输入新建的将用于复制的文件所在路径及名称*/
if ((in = fopen(infile, "r")) == NULL) /*以只写方式打开指定文件*/
{
printf("cannot open infile\n");
exit();
}
if ((out = fopen(outfile, "w")) == NULL)
{
printf("cannot open outfile\n");
exit();
}
ch = fgetc(in);
while (ch != EOF)
{
fputc(ch, out); /*将in指向的文件的内容复制到out所指向的文件中*/
ch = fgetc(in);
}
fclose(in);
fclose(out);
}
实例174 错误处理
问题:编程实现将文件中的制表符换成恰当数量的空格,要求每次读写操作后都调用ferror()函数检查错误。
逻辑:文件在错误处理中的专有函数.
- ferror函数:
例子:int ferror(FILE*stream);
这表示检测文件错误。返回值为0,表示没有出现错误,而非零值表示是有错的。
代码:
#include <stdio.h>
#include <stdlib.h>
void error(int e)/*自定义error函数判断出错的性质*/
{
if(e == )
printf("input error\n");
else
printf("output error\n");
exit(); /* 跳出程序 */
}
main()
{
FILE *in, *out; /*第一两个文件类型指针in和out*/
int tab, i;
char ch, filename1[], filename2[];
printf("please input the filename1:");
scanf("%s", filename1); /*输入文件路径及名称*/
printf("please input the filename2:");
scanf("%s", filename2); /*输入文件路径及名称*/
if ((in = fopen(filename1, "rb")) == NULL)
{
printf("can not open the file %s。\n", filename1);
exit();
}
if ((out = fopen(filename2, "wb")) == NULL)
{
printf("can not open the file %s。\n", filename2);
exit();
}
tab = ;
ch = fgetc(in); /*从指定的文件中读取字符*/
while (!feof(in))
/*检测是否有读入错误*/
{
if (ferror(in))
error();
if (ch == '\t')
/*如果发现制表符,则输出相同数目的空格符*/
{
for (i = tab; i < ; i++)
{
putc(' ', out);
if (ferror(out))
error();
}
tab = ;
}
else
{
putc(ch, out);
if (ferror(out))
/*检查是否有输出错误*/
error();
tab++;
if (tab == )
tab = ;
if (ch == '\n' || ch == '\r')
tab = ;
}
ch = fgetc(in);
} fclose(in);
fclose(out);
}
反思:头文件中的stdlib.h与stdio.h的区别,具体可以去百度。我的感觉就是初级编程stdio.h够用了,而涉及到系统,比如system.或者exit()等,就需要stdlib.h。但是有的时候就算你不用,编译器也只是会提出警告,但并不影响代码编译,运行。比如这个程序的代码行.9中的“exit(1)”就需要stdlib.h,但是不加,也只是警告,不会报错,导致无法编译、运行。
实例175 合并两个文件信息
问题:有两个内容分别为“hello computer!!”与“This is a c program!!”的文本文档,编程实现合并两个文件的信息。
逻辑:这个问题,你可以将一个文本的内容添加到另一个文本中,也可以将这两个文本添加到一个新建的文本中。这里,我们为了减少操作,采用了前者。
代码:
#include <stdio.h>
main()
{
char ch, filename1[], filename2[]; /*数组和变量的数据类型为字符型*/
FILE *fp1, *fp2; /*定义两个指向FILE类型结构体的指针变量*/
printf("please input filename1:\n");
scanf("%s", filename1); /*输入文件所在路径及名称*/
if ((fp1 = fopen(filename1, "a+")) == NULL) /*以读写方式打开指定文件*/
{
printf(" cannot open\n");
exit();
}
printf("file1:\n");
ch = fgetc(fp1);
while (ch != EOF)
{
putchar(ch); /*将文件1中的内容输出*/
ch = fgetc(fp1);
}
printf("\nplease input filename2:\n");
scanf("%s", filename2); /*输入文件所在路径及名称*/
if ((fp2 = fopen(filename2, "r")) == NULL) /*以只读方式打开指定文件*/
{
printf("cannot open\n");
exit();
}
printf("file2:\n");
ch = fgetc(fp2);
while (ch != EOF)
{
putchar(ch); /*将文件2中的内容输出*/
ch = fgetc(fp2);
}
fseek(fp2, 0L, ); /*将文件2中的位置指针移到文件开始处*/
ch = fgetc(fp2);
while (!feof(fp2))
{
fputc(ch, fp1); /*将文件2中的内容输出到文件1中*/
ch = fgetc(fp2); /*继续读取文件2中的内容*/
}
fclose(fp1); /*关闭文件1*/
fclose(fp2); /*关闭文件2*/
}
反思:代码行.34中的“fseek(fp2,0L,0)”是个不可缺少的代码。回想一下这篇文章开头,我们提到的文件操作本质。当我们第二个循环执行后,其fp2指向的并不是我们需要的文档开头,这中间我们也没有执行某个代码,使得fp2指向文档开头。所以,我们需要通过fseek函数,来转移指针fp2指向。
实例176 统计文件内容
问题:编程实现对指定文件中的内容进行统计。具体要求:输入要进行统计的文件的路径及名称,统计出该文件中字符、空格、数字及其他字符的个数,并将统计结果存到指定的磁盘文件中。
逻辑:统计问题是个常见问题,这次只是将其与文件操作结合起来而已。
代码:
#include <stdio.h>
main()
{
FILE *fp1, *fp2; /*定义两个指向FILE类型结构体的指针变量*/
char filename1[], filename2[], ch; /*定义数组及变量为字符型*/
long character, space, other, digit; /*定义变量为长整形*/
character = space = digit = other = ; /*长整形变量的初值均为0*/
printf("Enter file name \n");
scanf("%s", filename1); /*输入要进行统计的文件的路径及名称*/
if ((fp1 = fopen(filename1, "r")) == NULL)
/*以只读方式打开指定文件*/
{
printf("cannot open file\n");
exit();
}
printf("Enter file name for write data:\n");
scanf("%s", filename2); /*输入文件名即将统计结果放到那个文件中*/
if ((fp2 = fopen(filename2, "w")) == NULL) /*以可写方式要存放统计结果的文件*/
{
printf("cannot open file\n");
exit();
}
while ((ch = fgetc(fp1)) != EOF) /*知道文件内容结束处停止while循环*/
if (ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z')
character++; /*当遇到字母时字符个数加1*/
else if (ch == ' ')
space++; /*当遇到空格时空格数加1*/
else if (ch >= '' && ch <= '')
digit++; /*当遇到数字时数字数加1*/
else
other++; /*当是其他字符时其他字符数加1*/
close(fp1); /*关闭fp1指向的文件*/
fprintf(fp2, "character:%ld space:%ld digit:%ld other:%ld\n", character,
space, digit, other); /*将统计结果写入fp指向的磁盘文件中*/
fclose(fp2); /*关闭fp2指向的文件*/
}
反思:开头建立的两个FILE指针,一个指向需要打开的文件,一个指向用来记录结果的文件。代码行.24与.28是有好东西的,两者类似,那么只谈.28吧。代码行.28中的“ch>='0'&&ch<='9'”,其实这里面存在一个隐式转换,将字符转换为ASCII值来进行比较。
总结&反思:至此,C语言有关文件操作部分的基础内容就完毕了。后面还会有一篇,简单提升的文章。说起来,学习文件操作一方面是学习新函数,另一方面是学习其基础流程。至于如何扩展,就看个人了。
C语言范例学习06-上的更多相关文章
- C语言范例学习04
第三章 算法 前言:许多人对算法的看法是截然不同的,我之前提到过了.不过,我要说的还是那句话:算法体现编程思想,编程思想指引算法. 同时,有许多人认为简单算法都太简单了,应当去学习一些更为实用的复杂算 ...
- C语言范例学习03-中
栈和队列 这两者都是重要的数据结构,都是线性结构.它们在日后的软件开发中有着重大作用.后面会有实例讲解. 两者区别和联系,其实总结起来就一句.栈,后进先出:队列,先进先出. 可以将栈与队列的存储空间比 ...
- C语言范例学习03-上
第三章 数据结构 章首:不好意思,这两天要帮家里做一些活儿.而且内容量与操作量也确实大幅提升了.所以写得很慢. 不过,从今天开始.我写的东西,许多都是之前没怎么学的了.所以速度会慢下来,同时写得也会详 ...
- C语言范例学习01
编程语言的能力追求T型. 以前学过C语言,但是只学了理论. 从今天开始,我买了本<C语言程序开发范例宝典>.我要把它通关掉. 这应该可以极大地提升我的编程能力. 第一章 基础知识 这章没太 ...
- c语言基础学习06
=============================================================================涉及到的知识点有:1.C语言库函数.字符输入函 ...
- 16.go语言基础学习(上)——2019年12月16日
2019年12月13日10:35:20 1.介绍 2019年10月31日15:09:03 2.基本语法 2.1 定义变量 2019年10月31日16:12:34 1.函数外必须使用var定义变量 va ...
- C语言范例学习03-下
树与图 3.5 二叉树及其应用 PS:二叉树是最经典的树形结构,适合计算机处理,具有存储方便和操作灵活等特点,而且任何树都可以转换成二叉树. 实例101 二叉树的递归创建 实例102 二叉树的遍历 问 ...
- C语言范例学习02
第二章 指针 算是重点吧,这也是C语言的特色啊,直接访问物理存储. 重点: 指针就是一个存放它指向变量地址的变量,好绕口. 区分*在定义是与引用是的作用. 区分*.&的不同. 指针 ...
- go语言程序设计学习笔记-1
https://www.jb51.net/article/126998.htm go标准库文档https://studygolang.com/pkgdoc 1. 如果想要再本地直接查看go官方文档,可 ...
随机推荐
- freemarker将文件读写到HTML中
freemarker将文件读写到HTML中 1.设计思路 (1)写freemarker模板方法 (2)写測试文件方法 (3)新建ftl文件 (4)在指定的路径下.新建目录 2.写freemarker模 ...
- XML文档读取-DOM
DOM(Document Object Model),“文档对象模型”早期是为了解决不用浏览器间数据兼容问题提出的解决方案,现在已经是W3C组织推荐的处理可扩展标志语言的标准编程接口. W3C DOM ...
- 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序
引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序(http://www.cnblogs.com/chenxizhang/p/7148657.ht ...
- TextMesh Pro SpriteAsset Load From Assetbundle
遇到问题 我们项目分两个Unity的工程,Art(美术资源工程),Client(代码工程) 在Art工程中的TextMeshProUGUI Text中使用Emoji,打包成AB之后,在Client运行 ...
- Solr4.10与tomcat整合并安装中文分词器
1.solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索引. ...
- gunicorn Arbiter 源码解析
如前文所述,Arbiter是gunicorn master进程的核心.Arbiter主要负责管理worker进程,包括启动.监控.杀掉Worker进程:同时,Arbiter在某些信号发生的时候还可以热 ...
- svn搭建服务器--- 绝对好使---杜恩德
如何创建 SVN 服务器,并搭建自己的 SVN 仓库 听语音 | 浏览:1289 | 更新:2016-09-10 17:45 1 2 3 4 5 6 7 分步阅读 百度经验:jingyan.baidu ...
- React学习总结(一)
React学习总结 一.什么是React? 是Facebook公司开发的一套JS库 React的详细介绍https://www.jianshu.com/p/ae482813b791 二.老版本Reac ...
- HTML5 高级系列:web Storage
前言 HTML5 的 web Storage 存储方式有两种:localStorage 和 sessionStorage. 这两种方式都是通过键值对保存数据,存取方便,不影响网站性能.他们的用法相同, ...
- HTML基础教程-简介
关于html5笔记前言 之前有在W3school学习过html5以及javascript.为了和大家一块学习,为了回顾这些遗忘的基础,现在我把之前自己整理的笔记共享给大家.希望大家共同进步. HTML ...