C语言资料open函数的使用(参数选择)
C语言文件open函数的使用(参数选择)?
我现在的需求是linux下使用open函数:以二进制可读写的方式打开文件,如果文件存在,就读取前513个字节(如果文件小于513字节就写入513字节的0覆盖原来的文件),如果文件不存在就创建文件,并写入513个字节的0。
之后每隔30都会往文件内写入513个字节将文件中的头513个字节覆盖掉,我该如何使用open函数,write函数的参数?
例如:能用下列参数达到目的吗?
fpdmx = open("/mnt/nandflash/temp/dmx512.bin",O_RDWR | O_CREAT | O_NOCTTY | O_APEEND,777);
当需要覆盖写入前513个字节时,这样操作是否正确?
if(lseek(fpdmx,0,SEEK_SET) != -1)
{
write(fpdmx,dmxdata,513);
}
主要是1.我以O_APEEND方式(这是在文件尾追加方式)打开的,我能否将当前文件光标移到文件首部写入数据?
2.我将文件当前光标移到首部写入513个字节,文件是以覆盖前513个字节的形式写入,还是以插入513个字节的形式写入数据?我要的需求是以覆盖的方式写入,我这样操作能实现吗?
3.追问一下,如果上面的是以覆盖的方式写入数据,那如果我需要以在首部插入513个字节的数据有好的方法推荐么?
------解决方案--------------------
如果open函数打开的时候不用O_APPEND参数,先lseek到任意位置,可以在文件中的某个位置,然后write,则冲调文件里之前的内容。
如果open函数打开的时候用O_APPEND参数,无论lseek到任意位置,write都是从文件的末尾开始写的。
------解决方案--------------------
open函数用来打开一个设备,他返回的是一个整型变量,如果这个值等于-1,说明打开文件出现错误,如果为大于0的值
参考格式 if(fd=open("/dev/ttys0",O_RDWR
------解决方案--------------------
O_NOCTTY
------解决方案--------------------
O_NDELAY))<0 {printf("cannot open"};
int open(const char *pathname, int oflag, …/*, mode_t mode * / ) ;
打开的操作类型有如下几种
1) O_RDONLY 只读打开
2) O_WRONLY 只写打开
3) O_RDWR 读、写打开
4) O_APPEND 每次写时都加到文件的尾端
5) O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。
6) O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。
7) O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。
8) O_NOCTTY 如果p a t h n a m e指的是终端设备,则不将此设备分配作为此进程的控制终端。
9) O_NONBLOCK 如果p a t h n a m e指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
10)O_SYNC 使每次w r i t e都等到物理I / O操作完成。
这些控制字都是通过“或”符号分开(
------解决方案--------------------
)
------解决方案--------------------
你的第一个和第二个问题回答错了,
open时设置O_APEEND标志之后,每次对文件写时都会追加到文件末尾。
想要覆盖数据,就不能设置该标志
我现在的需求是linux下使用open函数:以二进制可读写的方式打开文件,如果文件存在,就读取前513个字节(如果文件小于513字节就写入513字节的0覆盖原来的文件),如果文件不存在就创建文件,并写入513个字节的0。
之后每隔30都会往文件内写入513个字节将文件中的头513个字节覆盖掉,我该如何使用open函数,write函数的参数?
例如:能用下列参数达到目的吗?
fpdmx = open("/mnt/nandflash/temp/dmx512.bin",O_RDWR | O_CREAT | O_NOCTTY | O_APEEND,777);
当需要覆盖写入前513个字节时,这样操作是否正确?
if(lseek(fpdmx,0,SEEK_SET) != -1)
{
write(fpdmx,dmxdata,513);
}
主要是1.我以O_APEEND方式(这是在文件尾追加方式)打开的,我能否将当前文件光标移到文件首部写入数据?
2.我将文件当前光标移到首部写入513个字节,文件是以覆盖前513个字节的形式写入,还是以插入513个字节的形式写入数据?我要的需求是以覆盖的方式写入,我这样操作能实现吗?
3.追问一下,如果上面的是以覆盖的方式写入数据,那如果我需要以在首部插入513个字节的数据有好的方法推荐么?
------解决方案--------------------
如果open函数打开的时候不用O_APPEND参数,先lseek到任意位置,可以在文件中的某个位置,然后write,则冲调文件里之前的内容。
如果open函数打开的时候用O_APPEND参数,无论lseek到任意位置,write都是从文件的末尾开始写的。
------解决方案--------------------
open函数用来打开一个设备,他返回的是一个整型变量,如果这个值等于-1,说明打开文件出现错误,如果为大于0的值
参考格式 if(fd=open("/dev/ttys0",O_RDWR
------解决方案--------------------
O_NOCTTY
------解决方案--------------------
O_NDELAY))<0 {printf("cannot open"};
int open(const char *pathname, int oflag, …/*, mode_t mode * / ) ;
打开的操作类型有如下几种
1) O_RDONLY 只读打开
2) O_WRONLY 只写打开
3) O_RDWR 读、写打开
4) O_APPEND 每次写时都加到文件的尾端
5) O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。
6) O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。
7) O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。
8) O_NOCTTY 如果p a t h n a m e指的是终端设备,则不将此设备分配作为此进程的控制终端。
9) O_NONBLOCK 如果p a t h n a m e指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
10)O_SYNC 使每次w r i t e都等到物理I / O操作完成。
这些控制字都是通过“或”符号分开(
------解决方案--------------------
)
------解决方案--------------------
你的第一个和第二个问题回答错了,
open时设置O_APEEND标志之后,每次对文件写时都会追加到文件末尾。
想要覆盖数据,就不能设置该标志