文件读写方面要注意的事有:
1. 忘了怎么用函数,可以直接 man 手册查
2. 打开描述符后应该检查一下是否打开,并且用完后关闭
3. 注意 read 循环读取一个文件的方法
4. lseek可以跳过文件中的内容,如果不手动更新,那就是读了多少就挪多少
一些简单的代码如下:
1 #include<unistd.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h>
/* open close read write lseek dup fcntl ioctl */ #include<memory.h> #include<iostream> #include"unix.h" using namespace std; struct Student{ char name[20]; char pwd[20]; }; // 保存学生到文件中 bool saveStruct(Student & s,int fd){ int i1 = write(fd,s.name,strlen(s.name)); int i2 = write(fd,s.pwd,strlen(s.pwd)); write(fd,"\n",1); return i1!=0&&i2!=0&&i1!=-1&&i2!=-1; } int main(int argc,char * argv[]){ // 录入学生 if(argc>=4){ Student s; memcpy(s.name,argv[1],strlen(argv[1])); memcpy(s.pwd,argv[2],strlen(argv[2])); int fd_save = open(argv[3],O_CREAT|O_APPEND|O_RDWR,0666); bool save = saveStruct(s,fd_save); if(save){ cout<<"保存用户成功!"<<endl; } close(fd_save); } // 仅输入文件名,则读取 if(argc==2){ int fd = open(argv[1],O_RDONLY); if(errno == ENOENT){ cout<<"没有该文件!"<<endl; } char buf[20]; lseek(fd,0,SEEK_SET); int len = read(fd,buf,20); cout<<string(buf)<<endl; len = read(fd,buf,20); cout<<string(buf)<<endl; close(fd); }// 复制文件 else if(argc == 3){ int fd = open(argv[1],O_RDONLY); int fd_cp = open(argv[2],O_RDWR|O_CREAT,0666); char buf[10]; int len = read(fd,buf,10); while(len != EOF && len != 0){ cout<<string(buf); int wN = write(fd_cp,buf,len); cout<<"写入:"<<wN<<endl; if(wN!=-1) cout<<"写入10B成功!"<<endl; // 最好清一下这个缓存 memset(buf,0,10); len = read(fd,buf,10); } close(fd); close(fd_cp); } return 0; }