文件读写方面要注意的事有:
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;
}
浙公网安备 33010602011771号