`- man 加 想要查询的东西,电脑会给出相应的解释
- 作业:Linux和window可执行文件的格式是什么?
- 作业:查一下FILE结构体
路径
- 绝对路径:以"/"开始的路径称之为绝对路径-->一般从根目录开始
- 相对路径:以". /"开始的路径叫做相对路径-->当前目录的上一级目录。
只读 方式打开文件
#include
#include
#include
#include//错误号的头文件
#include//strerror()通过它可以打印出相应的错误信息
#include
#include
//flag:O_RDONLY,O_WRNOLY,O_RDWR
//int open(const char *pathname ,int flag);
//使用flag制定打开的方式打开制定路径的文件
//若文件打开成功,返回该文件的一个新的文件描述符
//若文件打开失败,返回-1.
int main(void)
{
int fd = -1;
fd = open("stu.info",O_RDONLY);//以制度方式打开文件,若文件不存在,
//不会自动创建文件,打开失败。该路径是相对路径。
if (-1 == fd)
{
printf("open file failed....\n");
printf("errno = %d\n",errno);
//当打开失败是,会对errno设置错误值
printf("error:%s\n",strerror(errno));
//讲errno错误号所代表的错误信息一字符传的形式打印出来
}
else
{
printf("open file ok...\n");
close(fd);//关闭文件描述符
}
return 0;
}
只写方式打开文件
#include
#include //errno
#include //strerror() strlen()
#include //close() write()
/*open()*/
#include
#include
#include
//fd: 要写入数据的文件描述符
//buf: 要写的数据的首地址
//count:要写多少个数据
//size_t:失败时返回-1,成功是返回写入的数据字节数
//size_t write(int fd, const void *buf, size_t count);
int main(void)
{
int fd = -1;
fd = open("stu.info", O_WRONLY | O_CREAT
, S_IRWXU | S_IWGRP | S_IROTH);
if (-1 == fd)
{
printf("open file failed...\n");
printf("error: %s\n", strerror(errno));
}
else
{
printf("open file ok...\n");
int ret = -1;
char caBuf[32] = "Hello World";
ret = write(fd, caBuf, strlen(caBuf));//字符串用strlen
if (-1 == ret)
{
printf("write error: %s\n", strerror(errno));
}
else
{
printf("write %d bytes to file\n", ret);
}
close(fd);
}
return 0;
}
创建文件
#include
#include
#include
#include//错误号的头文件
#include//strerror()通过它可以打印出相应的错误信息
#include
#include
//flag:O_RDONLY,O_WRNOLY,O_RDWR
//int open(const char *pathname ,int flag);
//使用flag制定打开的方式打开制定路径的文件
//若文件打开成功,返回该文件的一个新的文件描述符
//若文件打开失败,返回-1.
int main(void)
{
int fd = -1;
fd = open("stu.info",O_RDONLY);//以制度方式打开文件,若文件不存在,
//不会自动创建文件,打开失败。该路径是相对路径。
if (-1 == fd)
{
printf("open file failed....\n");
printf("errno = %d\n",errno);
//当打开失败是,会对errno设置错误值
printf("error:%s\n",strerror(errno));
//讲errno错误号所代表的错误信息一字符传的形式打印出来
if(2 == errno)
{
fd = creat("stu.info",S_IRUSR | S_IWUSR | S_IRGRP |S_IROTH);
//创建stu.info这个文件,它的权限是后面的东西。
//S_IRUSR 00400 user has read permission
// S_IWUSR 00200 user has write permission
// S_IRGRP 00040 group has read permission
// S_IWOTH 00002 others have write permission
if(-1 == fd)
{
printf("error = %s\n",strerror(errno));
return -1;
}
else
{
printf("create file ok\n");
}
}
else
{
printf("error = %s\n",strerror(errno));
}
}
close(fd);//关闭文件描述符
return 0;
}
循环写入
#include
#include //write()
#include //errno
#include //strerror()
/*open()*/
#include
#include
#include
#define PER_WRITE_BYTES 4096
int myOpen(const char *pathname)
{
int fd = -1;
if (NULL != pathname)
{
fd = open(pathname, O_WRONLY | O_CREAT | O_TRUNC
, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (-1 == fd)
{
printf("open error: %s\n", strerror(errno));
}
}
return fd;
}
int myWrite(int fd, char *pData, int iTotalSize)
{
//对形参的值进行有效性检查
if (-1 != fd && NULL != pData && iTotalSize > 0)
{
int i = 0;
//若数据量比较大是,write可能一次性写不玩
//这种情况下,必须分多次循环的去写
//剩余要写的字节数
int iLeft = iTotalSize;
//已写入的字节数
int iWirted = 0;
//写数据时的返回值,出错返回-1,
//成功返回实际写入的字节数
int ret = -1;
//如果剩余的数据量大于等于PER_WRITE_BYTES
//则指定该次写入文件的数据量为PER_WRITE_BYTES
//否则指定为剩余的数据量:iLeft
if (iLeft >= PER_WRITE_BYTES)
{
ret = write(fd, pData, PER_WRITE_BYTES);
}
else
{
ret = write(fd, pData, iLeft);
}
if (-1 == ret)
{
printf("write error: %s\n", strerror(errno));
}
else
{
printf("%d, write %d bytes to file\n", ++i, ret);
//剩余数据量减去实际写入的数据量
//得到新的剩余数据量
iLeft -= ret;
//已写的数据量加上实际写入的数据量
//得到新的已写数据量
iWirted += ret;
//如果上次写入没有出错并且还有数据没写完
//则循环接着写
while (ret && iLeft)
{
if (iLeft >= PER_WRITE_BYTES)
{
//指针往后偏移到未写的数据位置
//从该位置开始将数据写入文件
ret = write(fd, pData+iWirted
, PER_WRITE_BYTES);
}
else
{
ret = write(fd, pData+iWirted
, iLeft);
}
if (-1 != ret)
{
iLeft -= ret;
iWirted += ret;
printf("%d, write %d bytes to file\n"
, ++i, ret);
}
else
{
printf("write error: %s\n", strerror(errno));
}
}
}
}
}
int main(void)
{
int fd = -1;
fd = myOpen("test.data");
if (-1 != fd)
{
char caBuf[4096789] = {'A'};
myWrite(fd, caBuf, sizeof(caBuf));
close(fd);
}
return 0;
}
循环读
#include
#include //write()
#include //errno
#include //strerror()
/*open()*/
#include
#include
#include
#define PER_WRITE_BYTES 4096
int myOpen(const char *pathname)
{
int fd = -1;
if (NULL != pathname)
{
fd = open(pathname, O_RDONLY | O_CREAT
, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (-1 == fd)
{
printf("open error: %s\n", strerror(errno));
}
}
return fd;
}
int main(void)
{
int fd = -1;
fd = myOpen("test.data");
if (-1 != fd)
{
char caBuf[32] = {'\0'};
int ret = -1;
ret = read(fd, caBuf, sizeof(caBuf));
if (-1 != ret)
{
caBuf[ret-1] = '\0';
printf("%s\n", caBuf);
}
else
{
printf("read error:%s\n", strerror(errno));
}
close(fd);
}
return 0;
}
结构体写入
#include
#include
#include
#include//错误号的头文件
#include//strerror()通过它可以打印出相应的错误信息
#include
#include
#include
typedef struct student
{
char name[20];
int num;
char sex[10];
int score;
}student;
int main(void)
{
int fd = -1;
fd = open("stu.info",O_WRONLY| O_CREAT, S_IRWXU|S_IWGRP|S_IROTH);
if (-1 == fd)
{
printf("open file failed....\n");
printf("errno = %d\n",errno);
printf("error:%s\n",strerror(errno));
}
else
{
printf("open file ok...\n");
int ret =-1;
student caBuf={"alex",100,"boy",81};
ret = write(fd,&caBuf,sizeof(caBuf));//这个位置注意,&caBuf
if(-1 == ret)
{
printf("write error:%s\n",strerror(errno));
}
else
{
printf("write %d bytes to file \n",ret);
}
close(fd);//关闭文件描述符
}
return 0;
}
写结构体
#include
#include //write()
#include //errno
#include //strerror()
/*open()*/
#include
#include
#include
#define PER_WRITE_BYTES 4096
typedef struct student
{
char name[20];
int num;
char sex[10];
int score;
}student;
int myOpen(const char *pathname)
{
int fd = -1;
if (NULL != pathname)
{
fd = open(pathname, O_RDONLY | O_CREAT
, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (-1 == fd)
{
printf("open error: %s\n", strerror(errno));
}
}
return fd;
}
int main(void)
{
int fd = -1;
fd = myOpen("stu.info");
if (-1 != fd)
{
student stu;
memset(&stu,'\0',sizeof(student));
int ret = -1;
ret = read(fd, &stu, sizeof(student));
if (-1 != ret)
{
printf("name:%s,num:%d,sex:%s,score:%d\n",
stu.name,stu.num,stu.sex,stu.score);
// printf("%s\n", caBuf);
}
else
{
printf("read error:%s\n", strerror(errno));
}
close(fd);
}
return 0;
}