gpt4 book ai didi

C 填充缓冲区

转载 作者:行者123 更新时间:2023-11-30 15:54:16 25 4
gpt4 key购买 nike

我需要用定义的源目录中的文件的文件描述符填充缓冲区空间。所以我有启动代码:

int main(int argc, char* argv[])
{
DIR *src=opendir(argv[1]);

struct dirent *DirEntry;
char* buffer[200];
do {
DirEntry = readdir(src);
if(DirEntry != NULL) {
//put file into buffer
}
}while(DirEntry!=NULL);
}

如何完成此循环以将给定目录的所有文件描述符放入名为“buffer”的数组中?我是否应该使用像 DirEntry->d_name 这样的 DirEntry 对象来返回一个文件描述符,然后将其放入数组中?

最佳答案

如果您需要将文件从源目录移动到目标目录,那么您需要的文件名远多于文件描述符。通过名称,您可以在需要时打开和关闭描述符;如果没有名称,您将无法明智地在目标目录中创建文件。但是,我们也可以处理文件描述符。

因此,假设您有 strdup(),您可以使用:

typedef struct File
{
char *name;
int fd;
} File;

在你的循环中:

if (DirEntry != NULL)
{
buffer[i].name = strdup(DirEntry->d_name);
if (buffer[i].name != 0)
buffer[i].fd = open(buffer[i].name, O_RDONLY);
i++;
}

其中 buffer 是一个 File 数组,i 是一个方便的整数:

enum { MAX_FILES = 4096 };
int i;
File buffer[MAX_FILES];

您还应该在主条件中添加一个条件,以确保不会溢出(或用动态分配的缓冲区替换固定大小的缓冲区):

if (DirEntry != NULL && i < MAX_FILES)

如果i达到限制,您可以明智地中断循环。您可以测试名称是否代表文件(而不是 FIFO、 block 设备、字符设备、套接字、符号链接(symbolic link)、目录……);您可能会使用 stat()lstat() 来实现这一点。如果 open() 调用失败,文件描述符将为负 (-1)。如果内存分配失败,您可以通过不增加 i 来保存条目,但这可能不值得担心。如果文件名的内存分配失败,则不会有其他任何工作。

关于C 填充缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13132683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com