#include <stdio.h>
#include <unistd.h> //write()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PER_IO_BYTES 4096
int myOpen(const char *pathname,mode_t mode)
{
int fd = -1;
if (NULL != pathname)
{
fd = open(pathname, mode | O_CREAT
, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (-1 == fd)
{
printf("open error: %s\n", strerror(errno));
}
}
return fd;
}
int main(int argc,char *argv[])
{
int fdForRead=-1;
fdForRead=myOpen(argv[1],O_RDONLY);
if(-1==fdForRead)
{
return -1;
}
int fdForWrite=-1;
fdForWrite=myOpen(argv[2],O_WRONLY);
if(-1==fdForWrite)
{
close(fdForRead);
return -1;
}
unsigned char caBuf[PER_IO_BYTES]={'\0'};
int ret=0;
while(1)
{
memset(caBuf,'\0',PER_IO_BYTES);
ret =read(fdForRead,caBuf,PER_IO_BYTES);
if(-1==ret)
{
printf("read error:%s\n",strerror(errno));
return -1;
}
else if(0==ret)
{
printf("copy file success\n");
break;
}
else
{
printf("read %d bytes from %s\n",ret,argv[1]);
ret=write(fdForWrite,caBuf,ret);
if(-1==ret)
{
printf("write error:%s\n",strerror(errno));
return -1;
}
printf("write %d bytes from %s\n",ret,argv[2]);
}
}
return 0;
}
#include <stdio.h>
#include <errno.h> //errno
#include <string.h> //strerror()
#include <unistd.h> //read() write()
/*open*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#if 0
//頭文件: /usr/include/unistd.h
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
#endif
//默認打開的三個文件:
//標準輸入, 標準輸出卫键,標準錯誤輸出
//標準輸入:0 -- STDIN_FILENO
//標準輸出:1 -- STDOUT_FILENO
//標準錯誤輸出:2 -- STDERR_FILENO
int main(int argc, char *argv[])
{
char caBuf[32] = {'\0'};
//read:默認阻塞讀終端,
// 即若標準輸入沒有數(shù)據(jù)可讀,則阻塞直到有數(shù)據(jù)到來
// 阻塞即為等待數(shù)據(jù)的輸入
// 可以結(jié)合scanf()函數(shù)來理解
int ret = read(STDIN_FILENO, caBuf, sizeof(caBuf));
if (-1 == ret)
{
printf("read error:%s\n", strerror(errno));
}
else
{
if (caBuf[31] != '\0')
{
caBuf[31] = '\0';
}
printf("%s\n", caBuf);
}
return 0;
}
#include <stdio.h>
#include <errno.h> //errno
#include <string.h> //strerror()
#include <unistd.h> //read() write()
/*open*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//頭文件:/usr/include/unistd.h
//默認打開的三個文件:
//標準輸入,標準輸出,標準錯誤輸入
//標準輸入:0---STDIN_FILENO
//標準輸出:1---STDOUT_FILENO
//標準錯誤輸入:2---STDERR_FILENO
int main(int argc, char *argv[])
{
int fd=-1;
fd=open("/dev/tty",O_RDWR | O_NONBLOCK);
printf("fd=%d\n",fd);
char caBuf[32]={'\0'};
int ret=-1;
//read:默認阻塞讀終端
//即若標準輸入沒有數(shù)據(jù)刻度,則阻塞直到有數(shù)據(jù)到來
//阻塞即為等待數(shù)據(jù)的輸入
//可以結(jié)合scanf函數(shù)來理解
while(1)
{
memset(caBuf,'\0',sizeof(caBuf));
ret=read(fd,caBuf,sizeof(caBuf));
if(-1==ret)
{
//EAGAIN:當設(shè)置非阻塞時,若沒有數(shù)據(jù)可讀,則出錯
//設(shè)置errno值為EAGAIN
if(EAGAIN!=errno)
{
// printf("errno=%d,%d\n",errno,EAGAIN);
printf("read error:%s\n",strerror(errno));
break;
}
printf("no data for reading\n");
sleep(1);
continue;
}
else
{
if(caBuf[31]!='\0')
{
caBuf[31]='\0';
}
printf("%s\n",caBuf);
}
}
return 0;
}
eintr
#include <stdio.h>
#include <unistd.h> //write() read() sleep()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
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 myRead(int fd, char *pData, int iTotalSize)
{
//對形參的值進行有效性檢查
if (-1 != fd && NULL != pData && iTotalSize > 0)
{
int iLeft = iTotalSize;
int iReaded = 0;
int ret = -1;
while (ret=read(fd,pData+iReaded,iLeft) && iLeft)
{
if (-1==ret)
{
//EINTR:當將要進行io操作時,被信號打斷
//則io操作失敗,則將errno值設(shè)置為EINTR
//這種情況下可以重新進行io操作
if(EINTR==errno||EAGAIN ==errno)
{
continue;
}
printf("read errno:%s\n",strerror(errno));
break;
}
iLeft -= ret;
iReaded += ret;
}
}
}
int main(void)
{
int fd = -1;
fd = myOpen("test.data");
if (-1 != fd)
{
char caBuf[1000100] = {'\0'};
myRead(fd, caBuf, sizeof(caBuf));
close(fd);
}
return 0;
}
- 學生結(jié)構(gòu)體,寫入6個學生信息,打印1,3,6位同學
- write.c
#include <stdio.h>
#include <unistd.h> //write()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define NAME_LEN 32
typedef struct Student
{
int iId;
char caName[NAME_LEN];
char cSex;
float fScore;
}Student;
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 main(void)
{
int fd = -1;
fd = myOpen("stu.info");
if (-1 != fd)
{
Student stu[6] = {
{1001, "zhangsan", 'f', 99},
{1002, "lisi", 'm', 79},
{1003, "wangwu", 'f', 89},
{1004,"damazi",'f',69},
{1005,"xiaofang",'m',98},
{1006,"xiaoming",'f',88}
};
int ret = -1;
int i = 0;
for (; i < 6; i++)
{
ret = write(fd, stu+i, sizeof(Student));
if (-1 == ret)
{
printf("write error: %s\n", strerror(errno));
}
else
{
printf("write %d bytes to file\n", ret);
}
}
}
return 0;
}
#include <stdio.h>
#include <unistd.h> //write() read()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define NAME_LEN 32
typedef struct Student
{
int iId;
char caName[NAME_LEN];
char cSex;
float fScore;
}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)
{
int ret = -1;
int i=0;
Student stu;
//將Student對象的空間都設(shè)置為'\0'
memset(&stu, '\0', sizeof(Student));
ret = read(fd, &stu, sizeof(Student));
if(-1!=ret)
{
printf("id:%d, name:%s, sex:%c, score:%.1f\n"
, stu.iId, stu.caName
, stu.cSex, stu.fScore);
}
off_t offset=lseek(fd,2*sizeof(Student),SEEK_SET);
if (-1!=offset)
{
memset(&stu, '\0', sizeof(Student));
ret = read(fd, &stu, sizeof(Student));
if(-1!=ret)
{
printf("id:%d, name:%s, sex:%c, score:%.1f\n"
, stu.iId, stu.caName
, stu.cSex, stu.fScore);
}
}
offset=lseek(fd,5*sizeof(Student),SEEK_SET);
if (-1!=offset)
{
memset(&stu, '\0', sizeof(Student));
ret = read(fd, &stu, sizeof(Student));
if(-1!=ret)
{
printf("id:%d, name:%s, sex:%c, score:%.1f\n"
, stu.iId, stu.caName
, stu.cSex, stu.fScore);
}
}
close(fd);
}
return 0;
}
#include <stdio.h>
#include <unistd.h> //write() read()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define NAME_LEN 32
typedef struct Student
{
int iId;
char caName[NAME_LEN];
char cSex;
float fScore;
}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)
{
int ret = -1;
int i=0;
Student stu;
while(1)
{
//將Student對象的空間都設(shè)置為'\0'
memset(&stu, '\0', sizeof(Student));
ret = read(fd, &stu, sizeof(Student));
if(-1!=ret)
{
printf("id:%d, name:%s, sex:%c, score:%.1f\n"
, stu.iId, stu.caName
, stu.cSex, stu.fScore);
}
off_t offset=lseek(fd,sizeof(stu),SEEK_CUR);
if (-1!=offset)
{
memset(&stu, '\0', sizeof(Student));
ret = read(fd, &stu, sizeof(Student));
if(-1!=ret)
{
printf("id:%d, name:%s, sex:%c, score:%.1f\n"
, stu.iId, stu.caName
, stu.cSex, stu.fScore);
}
}
offset=lseek(fd,2*sizeof(stu),SEEK_CUR);
if (-1!=offset)
{
memset(&stu, '\0', sizeof(Student));
ret = read(fd, &stu, sizeof(Student));
if(-1!=ret)
{
printf("id:%d, name:%s, sex:%c, score:%.1f\n"
, stu.iId, stu.caName
, stu.cSex, stu.fScore);
}
}
break;
}
close(fd);
}
return 0;
}
#include <stdio.h>
#include <unistd.h> //write() read() sleep()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd=-1;
fd=open(argv[1],O_RDWR | O_CREAT,S_IRUSR | S_IWUSR | S_IRGRP);
if(-1 == fd)
{
printf("open error:%s\n",strerror(errno));
return -1;
}
//偏移參照位置
//文件首部,當前位置,文件尾
//返回值為距離文件首的偏移量
//第一個參數(shù):文件描述符
//第二個參數(shù):相對參照位置的偏移量
// 當偏移為正數(shù)時,往參照位置后偏移
// 當偏移為負數(shù)時,往參照位置前偏移
//第三個參數(shù):參照位置SEEK_SET
//第三個參數(shù):參照位置
off_t offset = lseek(fd,0,SEEK_END);//返回值為距離文件頭的偏移量
if(-1==offset)
{
printf("lseek error:%s\n",strerror(errno));
}
else
{
printf("file size:%ld\n",offset);
}
return 0;
}
//./a.out test.data
//1234567890abcdefghijklmn
//file size=25
- 將文件的某個位置上的插入數(shù)據(jù)(覆蓋)
-
#include <stdio.h>
#include <unistd.h> //write() read() sleep()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd=-1;
//當打開一個文件時,讀寫位置默認在文件首部
fd=open(argv[1],O_RDWR | O_CREAT,S_IRUSR | S_IWUSR | S_IRGRP);
if(-1 == fd)
{
printf("open error:%s\n",strerror(errno));
return -1;
}
//偏移參照位置
//文件首部,當前位置,文件尾
//返回值為距離文件首的偏移量
//第一個參數(shù):文件描述符
//第二個參數(shù):相對參照位置的偏移量
// 當偏移為正數(shù)時,往參照位置后偏移
// 當偏移為負數(shù)時,往參照位置前偏移
//第三個參數(shù):參照位置SEEK_SET
//第三個參數(shù):參照位置
off_t offset = lseek(fd,0,SEEK_END);//返回值為距離文件頭的偏移量
if(-1==offset)
{
printf("lseek error:%s\n",strerror(errno));
}
else
{
printf("file size:%ld\n",offset);
}
//將讀寫位置偏移到
offset=lseek(fd,10,SEEK_SET);
printf("offset=%ld\n",offset);
char *iData="888";
write(fd,iData,strlen(iData));
close(fd);
return 0;
}
//./a.out test.data
//原來的為:1234567890abcdefghijklmn
//1234567890888defghijklmn
-
#include <stdio.h>
#include <unistd.h> //write() read() sleep()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd=-1;
//當打開一個文件時,讀寫位置默認在文件首部
fd=open(argv[1],O_RDWR | O_CREAT,S_IRUSR | S_IWUSR | S_IRGRP);
if(-1 == fd)
{
printf("open error:%s\n",strerror(errno));
return -1;
}
//偏移參照位置
//文件首部,當前位置,文件尾
//返回值為距離文件首的偏移量
//第一個參數(shù):文件描述符
//第二個參數(shù):相對參照位置的偏移量
// 當偏移為正數(shù)時,往參照位置后偏移
// 當偏移為負數(shù)時,往參照位置前偏移
//第三個參數(shù):參照位置SEEK_SET
//第三個參數(shù):參照位置
off_t offset = lseek(fd,0,SEEK_END);//返回值為距離文件頭的偏移量
if(-1==offset)
{
printf("lseek error:%s\n",strerror(errno));
}
else
{
printf("file size:%ld\n",offset);
}
//將讀寫位置偏移到第10位,輸入888,將abc替換成了888
offset=lseek(fd,10,SEEK_SET);
printf("offset=%ld\n",offset);
char *iData="888";
write(fd,iData,strlen(iData));
//往后5個位置插入666,將678替換為666
lseek(fd,5,SEEK_SET);
write(fd,"666",3);
close(fd);
return 0;
}
// ./a.out test.data
//原來的為:1234567890abcdefghijklmn
//1234566690888defghijklmn
- 在一個文件插入數(shù)據(jù),已追加的方式插入
#include <stdio.h>
#include <unistd.h> //write() read() sleep()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PER_IO_BYTES 4096
int myOpen(const char *pathname)
{
int fd = -1;
if (NULL != pathname)
{
fd = open(pathname, O_WRONLY | O_CREAT | O_APPEND
, 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");
char caBuf[10]="helloworld";
int ret=write(fd,caBuf,sizeof(caBuf));
if(ret==-1)
{
printf("write error:%s\n",strerror(errno));
}
else
{
printf("write %d bytes to file\n",ret);
}
close(fd);
}
//helloworldhelloworldhelloworld
pwrite
#include <stdio.h>
#include <unistd.h> //write() read() sleep()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd=-1;
//當打開一個文件時,讀寫位置默認在文件首部
fd=open(argv[1],O_RDWR | O_CREAT,S_IRUSR | S_IWUSR | S_IRGRP);
if(-1 == fd)
{
printf("open error:%s\n",strerror(errno));
return -1;
}
//偏移參照位置
//文件首部,當前位置,文件尾
//返回值為距離文件首的偏移量
//第一個參數(shù):文件描述符
//第二個參數(shù):相對參照位置的偏移量
// 當偏移為正數(shù)時,往參照位置后偏移
// 當偏移為負數(shù)時,往參照位置前偏移
//第三個參數(shù):參照位置SEEK_SET
//第三個參數(shù):參照位置
off_t offset = lseek(fd,0,SEEK_END);//返回值為距離文件頭的偏移量
if(-1==offset)
{
printf("lseek error:%s\n",strerror(errno));
}
else
{
printf("file size:%ld\n",offset);
}
//檔一個程序存在多個運行分支的時候,并且每個運行分支都有可能操作文件時存在以下問題:
//當A分支使用lseek設(shè)置讀寫位置完成時,
//A分支的運行暫停,B分支開始運行,并且B分支對文件進行了讀寫操作,從而改變了A分支設(shè)置的讀寫位置
//當B分支運行暫停.A分支重新接著往后運行時,若A分支要對文件進行讀寫,那么讀寫的位置并不是之前設(shè)置的位置,而是B分支運行后的讀寫位置,從而得不到預期結(jié)果
//原子操作:操作部分们童,要么都執(zhí)行嘀倒,要么都不執(zhí)行
//問題解決方案:將A分支的的lseek和之后的讀寫操作合成原子操作
// 1.將操作部分使用鎖,鎖住桨嫁,合成原子操作
// 2.調(diào)用pread()或者pwrite()函數(shù)來完成操作
/*lseek(fd,-5,SEEK_END);
write(fd,"666",3);*/
char *pData="Hello World";
ssize_t size=pwrite(fd,pData,strlen(pData),5);
if(-1==size)
{
printf("pwrite error:%s\n",strerror(errno));
}
close(fd);
return 0;
}
//原來為:1234567890
//現(xiàn)在為:12345Hello World
fsync
#include <stdio.h>
#include <unistd.h> //write() read() sleep()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/*sync()
syncfs()
fsync()
*/
int myOpen(const char *pathname)
{
int fd = -1;
if (NULL != pathname)
{
fd = open(pathname, O_WRONLY | O_CREAT
, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (-1 == fd)
{
printf("open error: %s\n", strerror(errno));
}
}
return fd;
}
int main()
{
int fd = -1;
fd = myOpen("test.data");
if (-1 != fd)
{
char *pData="Hello World";
write(fd, pData, strlen(pData));
//將緩沖區(qū)的
int ret=fsync(fd);
if(-1==ret)
{
printf("fsync error:%s\n",strerror(errno));
}
close(fd);
}
return 0;
}
//Hello World
pread
#include <stdio.h>
#include <unistd.h> //write() read() sleep()
#include <errno.h> //errno
#include <string.h> //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd=-1;
//當打開一個文件時,讀寫位置默認在文件首部
fd=open(argv[1],O_RDWR | O_CREAT,S_IRUSR | S_IWUSR | S_IRGRP);
if(-1 == fd)
{
printf("open error:%s\n",strerror(errno));
return -1;
}
//偏移參照位置
//文件首部,當前位置,文件尾
//返回值為距離文件首的偏移量
//第一個參數(shù):文件描述符
//第二個參數(shù):相對參照位置的偏移量
// 當偏移為正數(shù)時,往參照位置后偏移
// 當偏移為負數(shù)時,往參照位置前偏移
//第三個參數(shù):參照位置SEEK_SET
//第三個參數(shù):參照位置
off_t offset = lseek(fd,0,SEEK_END);//返回值為距離文件頭的偏移量
if(-1==offset)
{
printf("lseek error:%s\n",strerror(errno));
}
else
{
printf("file size:%ld\n",offset);
}
//檔一個程序存在多個運行分支的時候,并且每個運行分支都有可能操作文件時存在以下問題:
//當A分支使用lseek設(shè)置讀寫位置完成時,
//A分支的運行暫停,B分支開始運行,并且B分支對文件進行了讀寫操作,從而改變了A分支設(shè)置的讀寫位置
//當B分支運行暫停.A分支重新接著往后運行時,若A分支要對文件進行讀寫,那么讀寫的位置并不是之前設(shè)置的位置,而是B分支運行后的讀寫位置,從而得不到預期結(jié)果
//原子操作:操作部分贰军,要么都執(zhí)行玻蝌,要么都不執(zhí)行
//問題解決方案:將A分支的的lseek和之后的讀寫操作合成原子操作
// 方法1.將操作部分使用鎖,鎖住词疼,合成原子操作
// 方法2.調(diào)用pread()或者pwrite()函數(shù)來完成操作
//pread()/pwrite():偏移到距離文件首部n字節(jié)的地方進行讀寫操作
char *pData="Hello World";
//第四個參數(shù):從文件首部開始的偏移量
//第三個參數(shù):要寫入的字節(jié)數(shù)
ssize_t size=pwrite(fd,pData,strlen(pData),5);
if(-1==size)
{
printf("pwrite error:%s\n",strerror(errno));
}
char caBuf[32]={'\0'};
size=pread(fd,caBuf,3,3);
if(-1!=size)
{
printf("%s\n",caBuf);
}
close(fd);
return 0;
}
//12345Hello World