文件编程:
1、常见的文件类型:
普通文件:一般意义上的文件,作为数据存储在磁盘中,可以随机访问文件的内容。Linux系统中的文件是面向字节的,文件的内容以字节为单位进行存储和访问。
目录:目录是一种特殊的文件,目录可以像普通文件一样打开、关闭以及进行相应的操作。
管道:管道是Linux中的一种进程间通信的机制。
设备文件:设备文件没有具体的内容,对设备文件的读写操作实际上与某个设备的输入输出操作关联在一起。
符号链接:符号链接的内容是指向另一个文件的路径。当对符号链接进行操作时,系统会根据情况将这个操作转移到它所指向的文件上去,而不是对它本身进行操作。
Socket:socket也是一种进程间通信的方式,与管道不同的是,它们可以在不同的主机上进行通信,也就是网络通信。
2、如何表示文件:
所有执行I/O操作的系统调用使用文件描述符来表示打开的文件。
文件描述符是一个非负整数。
文件描述符可以表示各种类型的打开的文件。
对文件的操作只要使用文件描述符即可指定所操作的文件。
3、操作文件步骤:
打开文件,打开成功后,应用程序将获得文件描述符。
应用程序使用文件描述符对文件进行读写等操作。
全部操作完毕后,应用程序需要将文件关闭以释放用于管理打开文件的内存。
(1)、open()系统调用可以打开或创建一个文件。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
Returns file descriptor on success, or –1 on error
各参数及返回值的含义如下:
pathname:要打开或创建的文件名称。
flags:标志位,指定打开文件的操作方式。
mode:指定新文件的访问权限。(仅当创建新文件时才使用该参数)
返回值:若成功返回文件描述符,否则返回-1并设置变量errno的值。
O_RDOWRONLY:以只写方式打开文件。
O_RDWRNLY:以只读方式打开文件。
O_RDWR:以读写方式打开文件。
O_CREAT:如果被打开的文件不存在,则自动创建这个文件。
(2)、 read()系统调用从打开的文件中读取数据。
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
Returns number of bytes read, 0 on EOF, or –1 on error
各参数及返回值的含义如下:
fd:要读取的文件的描述符。
buf:读取到的数据要放入的缓冲区。
count:要读取的字节数。
返回值:若成功返回读到的字节数,若已到文件结尾则返回0,若出错则返回-1并设置变量errno的值。
注意:
1. 这里的size_t是无符号整型,ssize_t是有符号整型。
2. buf指向的内存空间必须事先分配好。
1、常见的文件类型:
普通文件:一般意义上的文件,作为数据存储在磁盘中,可以随机访问文件的内容。Linux系统中的文件是面向字节的,文件的内容以字节为单位进行存储和访问。
目录:目录是一种特殊的文件,目录可以像普通文件一样打开、关闭以及进行相应的操作。
管道:管道是Linux中的一种进程间通信的机制。
设备文件:设备文件没有具体的内容,对设备文件的读写操作实际上与某个设备的输入输出操作关联在一起。
符号链接:符号链接的内容是指向另一个文件的路径。当对符号链接进行操作时,系统会根据情况将这个操作转移到它所指向的文件上去,而不是对它本身进行操作。
Socket:socket也是一种进程间通信的方式,与管道不同的是,它们可以在不同的主机上进行通信,也就是网络通信。
2、如何表示文件:
所有执行I/O操作的系统调用使用文件描述符来表示打开的文件。
文件描述符是一个非负整数。
文件描述符可以表示各种类型的打开的文件。
对文件的操作只要使用文件描述符即可指定所操作的文件。
3、操作文件步骤:
打开文件,打开成功后,应用程序将获得文件描述符。
应用程序使用文件描述符对文件进行读写等操作。
全部操作完毕后,应用程序需要将文件关闭以释放用于管理打开文件的内存。
(1)、open()系统调用可以打开或创建一个文件。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
Returns file descriptor on success, or –1 on error
各参数及返回值的含义如下:
pathname:要打开或创建的文件名称。
flags:标志位,指定打开文件的操作方式。
mode:指定新文件的访问权限。(仅当创建新文件时才使用该参数)
返回值:若成功返回文件描述符,否则返回-1并设置变量errno的值。
O_RDOWRONLY:以只写方式打开文件。
O_RDWRNLY:以只读方式打开文件。
O_RDWR:以读写方式打开文件。
O_CREAT:如果被打开的文件不存在,则自动创建这个文件。
例如:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
//close(1);
int fd = open("yk.c", O_RDONLY|O_CREAT,0777);
if(fd == -1)
{
perror("open");
return -1;
}
printf("打开文件成功\n");
printf("%d",fd);
close(fd);
return 0;
}
(2)、 read()系统调用从打开的文件中读取数据。
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
Returns number of bytes read, 0 on EOF, or –1 on error
各参数及返回值的含义如下:
fd:要读取的文件的描述符。
buf:读取到的数据要放入的缓冲区。
count:要读取的字节数。
返回值:若成功返回读到的字节数,若已到文件结尾则返回0,若出错则返回-1并设置变量errno的值。
注意:
1. 这里的size_t是无符号整型,ssize_t是有符号整型。
2. buf指向的内存空间必须事先分配好。
例如:
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 1024
int main()
{
int fd = open("days.c", O_RDONLY);
if(fd == -1)
{
perror("open");
return -1;
}
char buf[SIZE] = {0};
ssize_t ret = read(fd, buf, SIZE-1);
if(ret == -1)
{
perror("read");
return -1;
}
if(ret == 0) //返回值如果是0,表示已经读取到了文件的结尾;
{
printf("读取结束\n");
}
printf("读取了%d 个字节 %s",ret,buf);
printf("\n");
close(fd);
return 0;
}