准备好好研究下redis源码,但是很久没用c语言写代码了,平时工作主要用java和js所以准备重新阅读学习下c语言经典书籍:C Primer Plus更好地阅读redis源码,我来为大家科普一下关于c primer看完了继续学哪本书 读书笔记之CPrimerPlus?下面希望有你要的答案,我们一起来看看吧!

c primer看完了继续学哪本书 读书笔记之CPrimerPlus

c primer看完了继续学哪本书 读书笔记之CPrimerPlus

为什么阅读《C Primer Plus》第六版

准备好好研究下redis源码,但是很久没用c语言写代码了,平时工作主要用java和js。所以准备重新阅读学习下c语言经典书籍:C Primer Plus。更好地阅读redis源码。


第13章 文件输入/输出

文件是当今计算机系统不可或缺的部分。文件用于存储程序、文档、数据、书信、表格、图形、照片、视频和许多其他种类的信息。

什么是文件

文件通常是在磁盘或固体硬盘上的一段已命名的存储区。C提供两种文件模式:文本模式和二进制模式。

文本模式和二进制模式

所有文件的内容都以二进制形式存储。

I/O的级别标准文件

C程序会自动打开3个文件,它们被称为标准输入(standard input)、标准输出(standard output)和标准错误输出(standard error output)。在默认情况下,标准输入是系统的普通输入设备,通常为键盘;标准输出和标准错误输出是系统的普通输出设备,通常为显示屏。

标准I/O

/* count.c -- 使用标准 I/O */ #include <stdio.h> #include <stdlib.h> // 提供 exit()的原型 int main(int argc, char *argv []) { int ch; // 读取文件时,存储每个字符的地方 File *fp; // “文件指针” unsigned long count = 0; if (argc != 2) { printf("Usage: %s filename\n", argv[0]); exit(EXIT_FAILURE); } if ((fp = fopen(argv[1], "r")) == NULL) { printf("Can't open %s\n", argv[1]); exit(EXIT_FAILURE); } while ((ch = getc(fp)) != EOF) { putc(ch, stdout); // 与 putchar(ch); 相同 count ; } fclose(fp); printf("File %s has %lu characters\n", argv[1], count); return 0; }

fopen函数getc和putc文件结尾

返回一个特殊值EOF代表文件末尾

int ch; FILE * fp; fp = fopen("wacky.txt", "r"); while (( ch = getc(fp)) != EOF) { putchar(ch); //处理输入 }

fclose函数

if (fclose(fp) != 0) printf("Error in closing file %s\n", argv[1]);

指向标准文件的指针

stdio.h头文件把3个文件指针与3个标准文件相关联,C程序会自动打开这3个标准文件。

fprintf和fscanf

文件I/O函数fprintf()和fscanf()函数的工作方式与printf()和scanf()类似,区别在于前者需要用第1个参数指定待处理的文件。都把FILE指针作为第一个参数,而不是最后一个参数。

fprintf(fp,"%s\n",words); fscanf(fp,"%s",words);

fgets和fputs随机访问fseek和ftell

fseek(fp,0L,SEEK_SET); //定位至文件开始处 fseek(fp,10L,SEEK_SET);//定位至文件中的第10个字符 fssek(fp,2L,SEEK_CUR);//从文件当前位置前移2个字节 fseek(fp,0L,SEEK_END);//定位至文件结尾 fseek(fp,-10L,SEEK_END);//从文件结尾处回退10个字节;

fgetpos和fsetpos

//调用该函数时,它把fpos_t类型的值放在pos指向的位置上,该值描述了文件中的当前位置距文件开头的字节数。如果成功,fgetpos()函数返回0;如果失败,返回非0。 int fgetpos(FILE * restrict stream,fpos_t * restrict pos); //调用该函数时,使用pos指向位置上的fpos_t类型值来设置文件指针指向偏移该值后指定的位置。如果成功,fsetpos()函数返回0;如果失败,则返回非0。fpos_t类型的值应通过之前调用fgetpos()获得。 int fsetpos(FILE *stream,const fpos_t *pos);

int ungetc(int c, FILE *fp)函数

int ungetc()函数把c指定的字符放回输入流中。

int fflush()函数

int fflush()函数

调用fflush()函数引起输出缓冲区中所有的未写入数据被发送到fp指定的输出文件。这个过程称为刷新缓冲区。

int setvbuf()函数

int setvbuf(FILE * restrict fp, char * restrict buf, int mode, size_t size);

setvbuf()函数创建了一个供标准I/O函数替换使用的缓冲区。在打开文件后且未对流进行其他操作之前,调用该函数。指针fp识别待处理的流,buf指向待使用的存储区。

fwrite和fread

size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb,FILE * restrict fp); size_t fread(void * restrict ptr, size_t size, size_t nmemb,FILE * restrict fp);

读书总结

这章仔仔细细看了两遍,对c的标准I/O有了清晰的认识,不像java的IO这么多。java的io虽然灵活,但略显繁琐。

,