合肥有哪些做网站的,wordpress $show_date,深圳南山网络公司,袜子网站建设规划书标准IO通过缓冲机制减少系统调用#xff0c;实现更高的效率 全缓冲#xff1a;当流的缓冲区无数据或无空间时才执行实际IO操作 行缓冲#xff1a;当在输入和输出中遇到换行符#xff08;\n#xff09;时#xff0c;进行IO操作 当流和一个终端关联时#xff0c;典型的行缓…标准IO通过缓冲机制减少系统调用实现更高的效率 全缓冲当流的缓冲区无数据或无空间时才执行实际IO操作 行缓冲当在输入和输出中遇到换行符\n时进行IO操作 当流和一个终端关联时典型的行缓冲 无缓冲数据直接写入文件流不进行缓冲
标准IOstdin、stdout、stderr 其中stdin和stdout默认行缓冲
缓冲区大小是1024个字节
文件的打开和关闭
打开
FILE *fopen(const char *path, const char *mode)
成功时返回流指针出错时返回NULL
文件打开的模式非常重要 “r” 或 “rb” 以只读方式打开文件文件必须存在。 “r” 或 ”rb” 以读写方式打开文件文件必须存在。 “w” 或 “wb” 以只写方式打开文件若文件存在则文件长度清为0。若文件不存在则创建。 “w” 或 “wb” 以读写方式打开文件其他同”w”。 “a” 或 “ab” 以只写方式打开文件若文件不存在则创建向文件写入的数 据被追加到文件末尾。 “a” 或 “ab” 以读写方式打开文件。其他同”a”
打开的程序 perror 库函数 头文件stdio.h strerror 库函数 头文件 errno.h string.h perror和strerror 功能打印系统的错误描述注意是系统错误不是你自己代码错误 关闭
函数原型int fclose(FILE *stream)
fclose()调用成功返回0失败返回EOF-1并设置errno流关闭时自动刷新缓冲中的数据并释放缓冲区比如常规文件把缓冲区内容写入磁盘当一个程序正常终止时所有打开的流都会被关闭fclose()函数的入参stream必须保证为非空否则出现段错误。 标准IO的字符输入和输出
按字符输入 int fgetc(FILE *stream); int getc(FILE *stream); //宏 int getchar(void); //只能读取标准输入的内容
成功时返回读取的字符若到文件末尾或出错时返回EOF-1
getchar()等同于fgetc(stdin)
getc和fgetc区别是一个是宏一个是函数
注意事项
1函数返回值是int类型不是char类型主要是为了扩展返回值的范围。
2 stdin 也是FILE *的指针是系统定义好的,指向的是标准输入键盘输入
3 打开文件后读取是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置
4 调用getchar会阻塞等待你的键盘输入 如下图所示打开文件后读取是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置
若想要两次fgetc读取同样内容就重新打开文件 按字符输出
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
成功时返回写入的字符出错时返回EOF
putchar(c)等同于fputc(c, stdout)
注意事项
1返回和输入参数都是int类型
2遇到这种错误Bad file descriptor 很可能是文件打开的模式错误只读模式去写只写模式去读
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c); 成功时返回写入的字符出错时返回EOF
putchar(c)等同于fputc(c, stdout)
注意事项
1返回和输入参数都是int类型
2遇到这种错误Bad file descriptor 很可能是文件打开的模式错误只读模式去写只写模式去读 行输入读取整个行
char *gets(char *s); 读取标准输入到缓冲区s
char *fgets(char *s, int size, FILE *stream);
成功时返回s到文件末尾或出错时返回NULL
遇到’\n’或已输入size-1个字符时返回总是包含’\0’ 注意事项
1 gets函数已经被淘汰因为会导致缓冲区溢出
2 fgets 函数第二个参数输入的数据超出sizesize-1个字符会保存到缓冲区最后添加’\0’如果输入数据少于size-1 后面会添加换行符。 行输出写整行 int puts(const char *s);
int fputs(const char *s, FILE *stream); 成功时返回非负整数出错时返回EOF
puts将缓冲区s中的字符串输出到stdout并追加’\n’
fputs将缓冲区s中的字符串输出到stream,不追加 ‘\n’ 二进制读写
文本文件和二进制的区别
存储的格式不同文本文件只能存储文本。
计算机内码概念文本符号在计算机内部的编码计算机内部只能存储数字0101001....,所以所有符号都要编码
二进制读写函数格式
size_t fread(void *ptr, size_t size, size_t n, FILE *fp);//读取fp中内容到ptr中
void *ptr 读取内容放的位置指针
size_t size 读取的块大小
size_t n 读取的个数 FILE *fp 读取的文件指针
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);//从ptr中写入到fp中
void *ptr 写文件的内容的位置指针
size_t size 写的块大小
size_t n 写的个数 FILE *fp 要写的文件指针
注意事项
文件写完后文件指针指向文件末尾如果这时候读读不出来内容。
解决办法移动指针后面讲解到文件头关闭文件重新打开 此时发现并不对读取stu2是错误的原因就是上面说的要注意指针的变化
流刷新定位 int fflush(FILE *fp);
成功时返回0出错时返回EOF
将流缓冲区中的数据写入实际的文件
Linux下只能刷新输出缓冲区,输入缓冲区丢弃
如果输出到屏幕使用fflush(stdout)
下图这个程序1.txt不会有内容因为都在缓冲区中。此时需要加入fflush 流的定位
long ftell(FILE *stream);//成功时返回流的当前读写位置出错时返回EOF
long fseek(FILE *stream, long offset, int whence);//定位一个流成功返回0出错EOF
void rewind(FILE *stream);
fseek 参数whence参数SEEK_SET/SEEK_CUR/SEEK_END
SEEK_SET从距文件开头 offset 位移量为新的读写位置
SEEK_CUR以目前的读写位置往后增加 offset 个位移量
SEEK_END将读写位置指向文件尾后再增加 offset 个位移量
offset参数偏移量可正可负 注意事项
1.文件的打开使用a模式 fseek无效
2.rewind(fp) 相当于 fseek(fp,0,SEEK_SET);
3.这三个函数只适用2G以下的文件
下面程序是抹去ef 格式化输入输出
格式化输出
int fprintf(FILE *stream, const char *fmt, …);
int sprintf(char *s, const char *fmt, …);
成功时返回输出的字符个数出错时返回EOF 格式化输入
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...); 重点掌握sprintf 和sscanf
标准IO练习 标准IO练习
time()用来获取系统时间(秒数)
time_t time(time_t *seconds) 1970.1.1 0:0:0
localtime()将系统时间转换成本地时间
struct tm *localtime(const time_t *timer)
struct tm { int tm_sec; /* 秒范围从 0 到 59 */ int tm_min; /* 分范围从 0 到 59 */ int tm_hour; /* 小时范围从 0 到 23 */ int tm_mday; /* 一月中的第几天范围从 1 到 31 */ int tm_mon; /* 月份范围从 0 到 11 */ int tm_year; /* 自 1900 起的年数 */ int tm_wday; /* 一周中的第几天范围从 0 到 6 */ int tm_yday; /* 一年中的第几天范围从 0 到 365 */ int tm_isdst; /* 夏令时 */
};
注意 int tm_mon; 获取的值要加1是正确的月份 int tm_year; 获取的值加1900是正确的年份 获取文件内的所有行数量 while(fgets(buf,32,fp)!NULL){ if(buf[strlen(buf)-1] \n){ //注意判断是否一行太长没有读完 linecount; }
}
写完文件记得fflush 写到磁盘里面去。
标准IO磁盘文件的缓冲区一般为4096
注意和标准输出的全缓冲区别标准输出是1024 获取文件内的所有行数量 while(fgets(buf,32,fp)!NULL){ if(buf[strlen(buf)-1] \n){ //注意判断是否一行太长没有读完 linecount; }
}
文件IO
文件IO的概念
什么是文件IO又称系统IO系统调用
是操作系统提供的API接口函数。
POSIX接口 了解
注意文件IO不提供缓冲机制 文件IO的API
open close read read
文件描述符概念
英文缩写fdfile descriptor
是0-1023的数字表示文件。
0, 1, 2 的含义 标准输入标准输出错误
open
int open(const char *pathname, int flags); 不创建文件
int open(const char *pathname, int flags, mode_t mode); 创建文件不能创建设备文件
成功时返回文件描述符出错时返回EOF
文件IO和标准的模式对应关系
r O_RDONLY
r O_RDWR
w O_WRONLY | O_CREAT | O_TRUNC, 0664
w O_RDWR | O_CREAT | O_TRUNC, 0664
a O_WRONLY | O_CREAT | O_APPEND, 0664
a O_RDWR | O_CREAT | O_APPEND, 0664 umask概念
umask 用来设定文件或目录的初始权限 文件或目录的初始权限 文件或目录的最大默认权限 - umask close
int closeint fd 关闭后文件描述符不能代表文件 文件IO的读写和定位 容易出错点
求字符串长度使用sizeof对二进制数据使用strlen
printf 的字符最后没有’\0’ 注意看下图write使用的是sizeof此处应该用strlen遇\0结束 修改后打印 此时上图buf2中无内容因为此时文件指针在尾部。此时先关闭再打开当然也可以使用lseek 输出如图所示 文件定位 目录操作和文件属性获取
目录读取
打开目录
#include dirent.h DIR *opendir(const char *name); DIR *fdopendir(int fd); 使用文件描述符要配合open函数使用
DIR是用来描述一个打开的目录文件的结构体类型
成功时返回目录流指针出错时返回NULL
读取目录
#include dirent.h struct dirent *readdir(DIR *dirp);
struct dirent是用来描述目录流中一个目录项的结构体类型
包含成员char d_name[256] 参考帮助文档
成功时返回目录流dirp中下一个目录项
出错或到末尾时时返回NULL
关闭目录
closedir函数用来关闭一个目录文件: #include dirent.h int closedir(DIR *dirp);
成功时返回0出错时返回EOF
代码遍历目录读取其中.和..代表当前目录和上一级目录 文件属性获取
修改文件权限
chmod/fchmod函数用来修改文件的访问权限: #include sys/stat.h int chmod(const char *path, mode_t mode); int fchmod(int fd, mode_t mode);
成功时返回0出错时返回EOF
注意在vmware和windows共享的文件夹下有些权限不能改变。 获取文件属性
#include sys/stat.h int stat(const char *path, struct stat *buf); int lstat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf);//同stat不过传的是文件描述符
成功时返回0出错时返回EOF
如果path是符号链接stat获取的是目标文件的属性而lstat获取的是链接文件的属性 代码ls -l实现