linux system io
####1、文件描述符
-STDIN_FILENO 0 标准输入
-STDOUT_FILENO 1 标准输出
-STDERR_FILENO 2 标准错误
####2、系统函数 open() close() 打开、关闭文件
-//该包含的头文件
-#include <sys/types.h-
-#include <sys/stat.h-
-#include <fcntl.h-
-#include <unistd.h-
-int open(const char* pathname, int flags);
-//flags :
-//O_RDONLY O_WRONLY O_RDWR O_CAREAT O_APPEND
-int close(int fd);
####3、显示出错信息
-#include <string.h-
-#include <errno.h-
-if(fd == -1)
-{
- //将error int 转换为error string
- printf("%s\n",strerror(errno));
-}
####4、系统函数 read()、write()读写文件
-ssize_t read (int fd,void *buf,size_t count);
-//成功则返回读取的字节数,读到EOF返回0,失败返回-1
-ssize_t write (int fd,void *buf,size_t count);
//读文件的代码
int main(int arg, char *args[])
{
if (arg < 2)
return 0;
int fd = open(args[1], O_RDONLY); //只读方式打开文件abc.txt
if (fd == -1)
{
printf("error is %s\n", strerror(errno));
} else
{
printf("success fd = %d\n", fd);
char buf[100];
memset(buf, 0, sizeof(buf));
while(read(fd, buf, sizeof(buf) - 1) > 0)//循环读取文件内容,直到文件结尾,退出循环
{
printf("%s\n", buf);
memset(buf, 0, sizeof(buf));
}
close(fd);
}
return 0;
}
//写文件的代码
int main(int arg, char *args[])
{
char s[] = "abc.txt";
int fd = open(s, O_RDWR | O_APPEND);//用读写追加方式打开文件
if (fd == -1)
{
printf("error is %s\n", strerror(errno));
}else
{
printf("success fd = %d\n", fd);
char buf[100];
memset(buf, 0, sizeof(buf));
strcpy(buf, "hello world\n");
int i = write(fd, buf, strlen(buf));//这里要用strlen函数
close(fd);
}
return 0;
}
####5、fstat() stat() 的使用
-int fstat (int fd, struct stat * buf)
-//参数fd必须是用open调用返回的有效文件描述符
-int stat (const char* path, struct stat * buf)
-//参数path必须是文件路径
-struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
- };
-std_mod成员:
-S_ISREG(m) is it a regular file?
-S_ISDIR(m) directory?
-S_ISCHR(m) character device?
-S_ISBLK(m) block device?
-S_ISFIFO(m) FIFO (named pipe)?
-S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
-S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
//得到文件状态代码
int main(int arg, char *args[])
{
int fd = open(args[1], O_RDONLY);
if (fd == -1)
{
printf("error is %s\n", strerror(errno));
}else
{
printf("success fd = %d\n", fd);
struct stat buf;
fstat(fd, &buf);
if (S_ISREG(buf.st_mode))//判断文件是否为标准文件
{
printf("%s is charfile\n", args[1]);
}
if (S_ISDIR(buf.st_mode))//判断文件是否为目录
{
printf("%s is dir\n", args[1]);
}
printf("%s size =%d\n", args[1], buf.st_size);//得到文件大小
close(fd);
}
return 0;
}
-关闭回显:
-char* getpass (const char *prompt)
-//参数prompt为屏幕提示字符
-//函数返回值为用户键盘输入的字符串
-int main ()
-{
char* phrase = getpass ("please input:");
printf("%s",phrase);
-}
####5、c语言库函数fopen()、fclose()打开、关闭文件
-FILE *p fopen (const char *path,const char * mode);
//fopen 以mode模式打开名为path的文件
//fopen 返回一个文件指针
//出现错误,fopen返回NULL,并把errno设置为恰当的值
//mode 说明:r r+ w w+ a a+
-int fclose(FILE* stream);
####6、c语言库函fread()、fwrite()数读写文件
-size_t fread(void *ptr,size_t size,size_t nmemb,FILE * stream);
-size_t fwrite(void *ptr,size_t size,size_t nmemb,FILE * stream);
//参数ptr指向缓冲区保存或读取的数据
//参数size 控制记录大小
//参数nmemb为记录数
//函数返回读取或回写的记录数
//原则上第二个参数*第三个参数不要大于第一个参数的buf【100】的大小
//C库函数读取文件的代码
int main(int arg, char *args[])
{
FILE *p = fopen(args[1], "r+");
if (p == NULL)
{
printf("error is %s\n", strerror(errno));
}else
{
printf("success\n");
char buf[100];
size_t rc = 0;
while(1)
{
size_t tmp = fread(buf, 1, sizeof(buf), p);//原则是第二个参数乘以第三个参数的大小不能超过缓冲区
rc += tmp;//求文件的大小
if (tmp == 0)
break;
}
printf("rc = %d\n", rc);
fclose(p);
}
return 0;
}
//c库函数读写二进制文件的代码
struct person
{
int id;
char name[20];
int age;
int sex;
char tel[20];
};
int Fwrite(int arg, char *args[])
{
FILE *p = fopen(args[1], "w");
if (p == NULL)
{
printf("error is %s\n", strerror(errno));
} else
{
printf("success\n");
struct person man[10];
memset(&man, 0, sizeof(man));
man[0].id = 0;
strcpy(man[0].name, "小明");
man[0].age = 50;
man[0].sex = 1;
strcpy(man[0].tel, "123");
man[1].id = 1;
strcpy(man[1].name, "小白");
man[1].age = 20;
man[1].sex = 0;
strcpy(man[1].tel, "321");
fwrite(&man, sizeof(struct person), 2, p);
fclose(p);
}
return 0;
}
int Fread(int arg, char *args[])
{
FILE *p = fopen(args[1], "w");
if (p == NULL)
{
printf("error is %s\n", strerror(errno));
} else
{
printf("success\n");
struct person man;
memset(&man, 0, sizeof(man));
while(fread(&man, sizeof(struct person), 1, p))
{
printf("id=%d\n", man.id);
printf("name=%s\n", man.name);
printf("age=%d\n", man.age);
printf("tel=%s\n", man.tel);
}
fclose(p);
}
return 0;
}
####7、行输入和行输出
-char fgets(char *s,int size,FILE *stream);
int fputs(const char *s,FILEe *stream);
//fgets 从文件中读取一行,返回EOF代表文件结束
//fputs 向文件中写入一行
####8、文件删除改名函数
-int remove (const char* pathname);
-int rename(const char* oldpath,const char *newpath);
####9、找到当前目录
-char * getcwd(char *buf,size_t size)
//getcwd函数把当前的工作目录返回
####10、获得目录列表
- #include <dirent.h-
DIR * opendir(const char * pathname)
//打开目录文件
struct dirent * readdir(DIR * dir)
//读出目录文件内容
int closedir(DIR * dir)
//关闭目录文件
//读目录的代码
int main(int arg, char *args[])
{
if (arg <2)
return 0;
DIR *dp;
struct dirent *dirp;
dp = opendir(args[1]);//打开目录文件
if (dp == NULL)
{
printf("error is %s\n", strerror(errno));
return 0;
}
while((dirp = readdir(dp)) != NULL)//用readdir循环读取目录内容,读到目录尾,循环break
{
printf("%s\n", dirp--d_name);//将目录下的文件名打印到屏幕
}
closedir(dp);//关闭目录
return 0;
}