博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6标准文件读写
阅读量:4937 次
发布时间:2019-06-11

本文共 5792 字,大约阅读时间需要 19 分钟。

标准文件库

查询文件属性
<sys/types.h>
<sys/stat.h>
int stat(const char *filename, struct stat *buf)
获取文件属性
int fstat(int fd, struct stat *buf)
功能同stat,但是入参是文件描述符
int lstat(const char *filename, struct stat *buf)
功能同 stat,但是能处理链接文件

查询文件属性
struct stat
dev_t st_dev //设备ID
mode_t st_mode //文件类型与权限(ls显示的 –rwx------)
nlink_t st_nlink //文件链接数
uid_t st_uid //文件所有人 ID
gid_t st_gid //文件所属组 ID
off_t st_size //文件大小
time_t st_atime //最近访问时间(access)
time_t st_mtime //最近修改时间(modify)
time_t st_ctime //文件状态最近改变时间(change)

 

查询文件属性

文件类型
S_IFREG 普通文件 -
S_IFDIR 目录文件 d
S_IFCHR 字符文件 c
S_IFBLK 块文件 b
S_IFIFO 管道文件 p
S_IFLNK 符号链接 l
S_IFSOCK 套接字文件 s
S_IFMT 掩码
判断方法: if (st_mode & S_IFMT)

 

查询文件属性

宏判断, 返回 0或者1
S_ISREG(st_mode) /* 判断是否为普通文件 - */
S_ISDIR(st_mode) /* 判断是否为目录文件 d */
S_ISCHR(st_mode) /* 判断是否为字符文件 c */
S_ISBLK(st_mode) /* 判断是否为块文件 b */
S_ISFIFO(st_mode) /* 判断是否为管道文件 p */
S_ISLNK(st_mode) /* 判断是否为符号链接 l */
S_ISSOCK(st_mode) /*判断是否位套接字文件*/

文件访问权限属性

S_IRUSR S_IWUSR S_IXUSR
S_IRGRP S_IWGRP S_IXGRP
S_IROTH S_IWOTH S_IXOTH

if (st_mode & S_IRUSR)

r w x usr grp oth 权限和使用者

事实上,这些宏,只是把 000 000 000 这个 9 个bit位的数字,对应位置置位位1 (高位补0)。

S_IRUSR = 0400 S_IWUSR = 0200 S_IXUSR =0100
S_IRGRP = 0040 ...

查询文件系统相关信息
#include <sys/statfs.h> 或者下面这个
#include<sys/vfs.h>
int statfs(const char *path, struct statfs *buf)
int fstatfs(int fd, struct statfs *buf)
结构体解析:
struct statfs
long f_type; /* 文件系统类型 */
long f_bsize; /* 经过优化的传输块大小 */
long f_blocks; /* 文件系统数据块总数 */
long f_bfree; /* 可用块数 */
long f_bavail; /* 非超级用户可获取的块数 */
long f_files; /* 文件结点总数 */
long f_ffree; /* 可用文件结点数 */
fsid_t f_fsid; /* 文件系统标识 */
long f_namelen; /* 文件名的最大长度 */

 

文件操作

#include<stdio.h>
FILE* fopen(const char* filename, const char* mode)
打开文件
FILE* freopen(const char* filename, const char* mode, FILE* stream)
文件重定向, 操作 stream文件时候,实际操作的是 filename文件
int fclose(FILE* stream)
关闭文件
int remove(const char *filename)
删除文件
int rename(const char *oldname, const char * newname)
重命名文件

freopen 文件流重定向
FILE *pFile
pFile= freopen(“1.txt”, “w”, stdout)
所有输出到stdout的内容被输出到 1.txt
pFile = freopen(“1.txt”, “r”, stdin)
所有有stdin输入的地方,变成从 1.txt 输入

注意:输出到stdout等同于写入文件,输入到stdin等同于读取文件

stdin=fopen("/dev/tty","r")
stdout=fopen("/dev/tty","w")

stdin表示控制台读这个文件,就相当于scanf();

stdout表示控制台写这个文件,相当于printf();

重定向类似与管子,一边是stdin或stdout,另一边是文件。
当文件打开并与stdout连通时,以下两句等效:
fprintf(stdout,"this is write1\n");
fprintf(file,"this is write2\n");

例子:
#include <stdio.h>

//写入文件

void test_freopen()
{
fprintf(stdout,"this is test!\n");
FILE *file=freopen("1.txt","w",stdout);
if(file==NULL)
{
return ;
}
fprintf(stdout,"this is write1\n");
fprintf(file,"this is write2\n");

fclose(file);

printf("this is end\n");
}
//读取文件
void test_freopen2()

{

char buf[1024];
scanf("%s",buf);
printf("your input is %s\n",buf);
FILE *file=freopen("1.txt","r",stdin);
if(file==NULL)
{
return ;
}
scanf("%s",buf);
printf("your input is %s\n",buf);
fclose(file);

}

void main()

{
test_freopen();
test_freopen2();
}

 

标准文件操作(与C语言一样)

标准输入
int getc(FILE *stream)
从文件流中读取字符,宏定义方式,效率高,括号里面不要进行运算
int fgetc(FILE *stream)
从文件中读取字符,函数定义形式,效率比getc()低
int getchar(void)
从stdin 读入一个字符, 事实上,就是 getc(stdin)

char *gets(char *s)

从stdin 中读取字符存入 s,返回NULL或者s地址
char *fgets(char *s, int n, FILE *stream)
加入流长度控制

注意:fgetc(file)返回值是 int,不是 char,因为char类型的一个字符是255,此时可能会多出一个未知字符

buf=(fgetc(file))!=EOF 返回 EOF = int(-1) = 0xffffffff 时表示读取结束

 

标准输出

putchar(int c)
putc(int c, FILE *stream)
fputc(int c, FILE *stream)
区别联系类似 getc, getchar, fgetc
前缀 f 就是 function的意思

行输出:以 ‘\0’ 结束输出

int puts(const char *s)
int fputs(const char *s, FILE *stream

 

块读写

size_t fread(void *ptr, size_t size, size_t nBlock, FILE *stream)
size_t fwrite(const void *ptr, size_t size, size_t nBlock, FILE *stream)
块读写可存储结构体。,第三参数表示存储块的数目。

例子:
#include <stdio.h>
typedef struct CWR
{
int x;
int y;
char buf[8];
}CWR;

void test_freopen()

{
FILE *file=fopen("1.txt","w");
if(file==NULL)
{
return ;
}

CWR wr[]={

{1,2,"Hello"},{3,4,"World"}};
fwrite(&wr,sizeof(CWR),2,file);

fclose(file);

}

void test_freopen2()

{

FILE *file=fopen("1.txt","r");
if(file==NULL)
{
return ;
}
CWR wrr;
fread(&wrr,sizeof(CWR),1,file);
printf("%d %d %s\n",wrr.x,wrr.y,wrr.buf);

fread(&wrr,sizeof(CWR),1,file);

printf("%d %d %s\n",wrr.x,wrr.y,wrr.buf);

fclose(file);

}
void main()
{
test_freopen();
test_freopen2();
}

 

 

 

注意:以下的格式化多用于合并字符,
如:str="sprintf","操作";
int sprintf(strr, "操作%s", str);
那么,strr="操作sprintf";

格式化输出

int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
格式控制
%3d 右对齐输出(左边填空格)
%-3d 左对齐 (右边填空格)
%+d 带符号输出( +, -)
% d 带符号输出(空格,-)
%#x 进制输出带前缀(0, 0x

格式化输入

int scanf(const char *format, ...)
int fscanf(FILE *stream, const char* format, ...)
int sscanf(const char* s, const char* format, ...)

文件读写与定位
int fseek(FILE *stream, long offset, int whence);
SEEK_SET SEEK_END SEEK_CUR
long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);

文件状态
ferror(FILE*)
发生IO错误 返回非0,正常返回0
feof(FILE*)
文件结束EOF返回非0, 否则返回0
clearer(FILE*)
清除IO错误标志和 EOF标志

获取错误信息

char* strerror(errno)
返回当前错误信息
printf(“There is a error[%s]:%s\n”, “MY”, strerror(errno))
头文件 errno.h string.h
perror(char *);
在里面集成了 strerror(errno),
这个里面不支持我们输出参数

 

文件缓冲

BUFSIZ 缓冲区大小的宏,256的整数倍
void setbuf(FILE*, char *buf)
把文件缓冲区设置位 buf, 这里buf大小位 BUFSIZ
buf为NULL则关闭缓存
int setvbuf(FILE*, char *buf, int type, size_t size)
指定缓冲区位置(buf)和大小(size)
type 指定缓冲模式
_IOFBF:全缓冲: 普通文件读写,缓冲区满时写入文件,读出文件直到缓冲区满
_IOLBF:行缓冲: 遇到换行(‘\n’)刷新缓冲区, stdout, stdin
_IONBF:无缓冲: 所有IO直接执行, stderr
int fflush(FILE *);
强制刷新缓冲区

变长参数使用
#include<stdarg.h>
va_list 定义变量列表变量
va_start 获取变量列表起始地址
va_arg 获取变量,同时指向下一个变量
va_end 结束变量获取,释放句柄(清零变量)
vsprintf/vsnprintf 从变量列表里依次格式化取变量

记录日志函数 WriteLog(char *pFmt, ...)

 

转载于:https://www.cnblogs.com/gd-luojialin/p/9215943.html

你可能感兴趣的文章
如何在Oracle 10g中跟踪SQL
查看>>
android IOC框架学习记录
查看>>
CDOJ 1279 班委选举 每周一题 div2 暴力
查看>>
HDU 5745 La Vie en rose 暴力
查看>>
Day12 线程池、RabbitMQ和SQLAlchemy
查看>>
jQuery中$.each()方法的使用(从业人员项目--添加产品和修改产品,定价时用到了)...
查看>>
《算法导论》第六章----优先级队列(代码实现+部分练习)
查看>>
《Linux/Unix系统编程手册》读书笔记3
查看>>
10·
查看>>
Iframe高度自适应
查看>>
thinkphp-内置标签
查看>>
qt QTableWidget&&QTableView 导出数据到excel
查看>>
二叉树
查看>>
linux系统日志解析
查看>>
accelerated C++ 中查找url(学习笔记)
查看>>
PhpStorm的破解 汉化
查看>>
Spring---浅谈IOC
查看>>
JAVA开发常用计算机命令
查看>>
check android Media Scanner is running-检查Android Media Scanner 是否在运行
查看>>
tensorflow 笔记
查看>>