C

在 UNIX 環境中使用 C 程式語言創建空文件的問題

  • February 26, 2016

我最近開始在 UNIX 環境中程式。我需要編寫一個程序,該程序使用此命令在終端中創建一個具有名稱和大小的空文件

gcc foo.c -o foo.o 
./foo.o result.txt 1000

這裡的 result.txt 表示新創建的文件的名稱,1000 表示文件的大小(以字節為單位)。

我確定lseek函式會移動文件偏移量,但問題是每當我執行程序時,它都會創建一個具有給定名稱的文件,但是文件的大小是0

這是我的小程序的程式碼。

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
int main(int  argc, char **argv)
{
   int fd;
   char *file_name;
   off_t bytes;
   mode_t mode;

   if (argc < 3)
   {
       perror("There is not enough command-line arguments.");
       //return 1;
   }

   file_name = argv[1];
   bytes = atoi(argv[2]);
   mode = S_IWUSR | S_IWGRP | S_IWOTH;

   if ((fd = creat(file_name, mode)) < 0)
   {
       perror("File creation error.");
       //return 1;
   }
   if (lseek(fd, bytes, SEEK_SET) == -1)
   {
       perror("Lseek function error.");
       //return 1;
   }
   close(fd);
   return 0;
}

如果您在文件末尾之後查找,則必須在該位置寫入至少一個字節:

write(fd, "", 1);

讓作業系統用零填充這個洞。

因此,如果您想使用 1000 創建一個特定大小的空文件lseek,請執行以下操作:

lseek(fd, 999, SEEK_SET); //<- err check
write(fd, "", 1); //<- err check

ftruncate可能更好,它似乎也可以毫不費力地創建稀疏文件:

ftruncate(fd, 1000); 

您沒有向文件寫入任何內容。

您打開文件,移動文件描述符,然後關閉它。

從 lseek 手冊頁

lseek() 函式根據指令 wherece 將文件描述符 fildes 的偏移量重新定位到參數偏移量。

引用自:https://unix.stackexchange.com/questions/266039