在 UNIX 环境中使用 C 编程语言创建空文件时遇到问题
Trouble with creating an empty file using C programming language in UNIX environment
我最近开始在 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;
}
如果不允许您使用任何其他函数来协助创建 "blank" 文本文件,为什么不在 creat
上更改文件模式然后循环写入:
int fd = creat(file_name, 0666);
for (int i=0; i < bytes; i++) {
int wbytes = write(fd, " ", 1);
if (wbytes < 0) {
perror("write error")
return 1;
}
}
您可能希望在此处进行一些额外的检查,但这是一般的想法。
我不知道在你的情况下什么是可以接受的,但是,可能只在 lseek
之后添加 write
调用甚至:
if ((fd = creat(file_name, 0666)) < 0) // XXX edit to include write
{
perror("File creation error.");
//return 1;
}
if (lseek(fd, bytes - 1, SEEK_SET) == -1) // XXX seek to bytes - 1
{
perror("Lseek function error.");
//return 1;
}
// add this call to write a single byte @ position set by lseek.
if (write(fd, " ", 1) == -1)
{
perror("Write function error.");
//return 1;
}
close(fd);
return 0;
我最近开始在 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;
}
如果不允许您使用任何其他函数来协助创建 "blank" 文本文件,为什么不在 creat
上更改文件模式然后循环写入:
int fd = creat(file_name, 0666);
for (int i=0; i < bytes; i++) {
int wbytes = write(fd, " ", 1);
if (wbytes < 0) {
perror("write error")
return 1;
}
}
您可能希望在此处进行一些额外的检查,但这是一般的想法。
我不知道在你的情况下什么是可以接受的,但是,可能只在 lseek
之后添加 write
调用甚至:
if ((fd = creat(file_name, 0666)) < 0) // XXX edit to include write
{
perror("File creation error.");
//return 1;
}
if (lseek(fd, bytes - 1, SEEK_SET) == -1) // XXX seek to bytes - 1
{
perror("Lseek function error.");
//return 1;
}
// add this call to write a single byte @ position set by lseek.
if (write(fd, " ", 1) == -1)
{
perror("Write function error.");
//return 1;
}
close(fd);
return 0;