我尝试使用open()创建文件,然后使用lseek()移动1MB,最后需要在该文件中写入1个字节。
有我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int f_open(const char *name);
int f_open(const char *name){
int dskr;
dskr = open( name, O_CREAT );
if( dskr == -1 ){
perror( name );
exit(1);
}
printf( "dskr = %d\n", dskr );
return dskr;
}
int main( int argc, char *argv[] ){
int d;
int f;
char buf[20];
if( argc != 2 ){
printf( "Naudojimas:\n %s failas_ar_katalogas\n", argv[0] );
exit( 255 );
}
d = f_open( argv[1] );
lseek( d, 1, SEEK_SET );
f = write( d, buf, 1);
return 0;
}
文件创建正确,但是我不确定移动1MB是否可以正常工作,并且写入也无法正常工作。我不确定,因为程序可以正确运行,但是它的大小为0。
我在做什么错了?
答案 0 :(得分:2)
一些错误:
dskr = open( name, O_CREAT );
open()
的标志必须包含O_RDONLY
,O_WRONLY
或O_RDWR
中的一个。因此,您可能需要O_WRONLY | O_CREAT
。
lseek( d, 1, SEEK_SET );
lseek
的偏移量以字节为单位。如果要搜索1兆字节,则必须将其转换为字节。一种方便易读的方法是编写1024*1024
。
此外,您还应该检查lseek
的返回值并适当报告任何错误。
f = write( d, buf, 1);
您从未初始化buf[0]
,因此您正在写入一个字节的垃圾。 (无论如何,如果您永远不会使用其他19个字节,那么buf
为20字节是没有意义的。)
此外,您还应该检查write
的返回值,并适当地处理错误或短写入。