linux system io


原文链接: 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;
}
`