创建文件,使用lseek()移动1MB,然后将一个字节写入文件

时间:2019-04-27 17:17:52

标签: c shell unix

我尝试使用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。

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

一些错误:

   dskr = open( name, O_CREAT );

open()的标志必须包含O_RDONLYO_WRONLYO_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的返回值,并适当地处理错误或短写入。